nuclear@1: #include "object.h" nuclear@1: #include "opengl.h" nuclear@19: #include "shadow.h" nuclear@1: nuclear@14: Material::Material() nuclear@14: : diffuse(1, 1, 1), specular(0, 0, 0) nuclear@14: { nuclear@14: shininess = 60.0; nuclear@14: alpha = 1.0; nuclear@14: } nuclear@14: nuclear@14: RenderOps::RenderOps() nuclear@14: { nuclear@14: zwrite = true; nuclear@14: } nuclear@14: nuclear@14: void RenderOps::setup() const nuclear@14: { nuclear@14: if(!zwrite) { nuclear@14: glDepthMask(0); nuclear@14: } nuclear@14: } nuclear@14: nuclear@1: Object::Object() nuclear@1: { nuclear@1: mesh = 0; nuclear@4: tex = 0; nuclear@15: sdr = 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@15: void Object::set_shader(unsigned int sdr) nuclear@15: { nuclear@16: if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) { nuclear@16: this->sdr = sdr; nuclear@16: } nuclear@15: } nuclear@15: nuclear@1: void Object::draw() const nuclear@1: { nuclear@1: if(!mesh) return; nuclear@1: nuclear@14: glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT); nuclear@14: rop.setup(); nuclear@14: nuclear@19: if(sdr && !shadow_pass) { nuclear@15: glUseProgram(sdr); nuclear@15: } nuclear@15: 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@15: if(sdr) { nuclear@15: glUseProgram(0); nuclear@15: } nuclear@15: nuclear@6: glMatrixMode(GL_MODELVIEW); nuclear@6: glPopMatrix(); nuclear@14: nuclear@14: glPopAttrib(); 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: }