nuclear@0: #include "object.h" nuclear@0: #include "opengl.h" nuclear@0: #include "shadow.h" nuclear@2: #include "shader.h" nuclear@0: nuclear@0: Material::Material() nuclear@0: : diffuse(1, 1, 1), specular(0, 0, 0) nuclear@0: { nuclear@0: shininess = 60.0; nuclear@0: alpha = 1.0; nuclear@0: } nuclear@0: nuclear@0: RenderOps::RenderOps() nuclear@0: { nuclear@0: zwrite = true; nuclear@0: cast_shadows = true; nuclear@0: transparent = false; nuclear@0: } nuclear@0: nuclear@0: void RenderOps::setup() const nuclear@0: { nuclear@0: if(!zwrite) { nuclear@0: glDepthMask(0); nuclear@0: } nuclear@0: if(transparent) { nuclear@0: glEnable(GL_BLEND); nuclear@0: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@0: } else { nuclear@0: glDisable(GL_BLEND); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: Object::Object() nuclear@0: { nuclear@0: mesh = 0; nuclear@0: tex = 0; nuclear@0: sdr = 0; nuclear@0: } nuclear@0: nuclear@0: Object::~Object() nuclear@0: { nuclear@0: delete mesh; nuclear@0: } nuclear@0: nuclear@0: Matrix4x4 &Object::xform() nuclear@0: { nuclear@0: return matrix; nuclear@0: } nuclear@0: nuclear@0: const Matrix4x4 &Object::xform() const nuclear@0: { nuclear@0: return matrix; nuclear@0: } nuclear@0: nuclear@0: Matrix4x4 &Object::tex_xform() nuclear@0: { nuclear@0: return tex_matrix; nuclear@0: } nuclear@0: nuclear@0: const Matrix4x4 &Object::tex_xform() const nuclear@0: { nuclear@0: return tex_matrix; nuclear@0: } nuclear@0: nuclear@0: void Object::set_mesh(Mesh *m) nuclear@0: { nuclear@0: this->mesh = m; nuclear@0: } nuclear@0: nuclear@0: Mesh *Object::get_mesh() const nuclear@0: { nuclear@0: return mesh; nuclear@0: } nuclear@0: nuclear@0: void Object::set_texture(unsigned int tex) nuclear@0: { nuclear@0: this->tex = tex; nuclear@0: } nuclear@0: nuclear@0: void Object::set_shader(unsigned int sdr) nuclear@0: { nuclear@0: if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) { nuclear@0: this->sdr = sdr; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: unsigned int Object::get_shader() const nuclear@0: { nuclear@0: return sdr; nuclear@0: } nuclear@0: nuclear@0: void Object::draw() const nuclear@0: { nuclear@0: if(!mesh) return; nuclear@0: nuclear@0: if(shadow_pass && !rop.cast_shadows) { nuclear@0: return; nuclear@0: } nuclear@0: nuclear@0: glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT); nuclear@0: rop.setup(); nuclear@0: nuclear@0: if(glcaps.shaders) { nuclear@0: if(sdr) { nuclear@0: if(!shadow_pass) { nuclear@2: ::set_shader(sdr); nuclear@0: } nuclear@0: } else { nuclear@2: ::set_shader(0); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(tex) { nuclear@0: glBindTexture(GL_TEXTURE_2D, tex); nuclear@0: glEnable(GL_TEXTURE_2D); nuclear@0: nuclear@0: glMatrixMode(GL_TEXTURE); nuclear@0: glPushMatrix(); nuclear@0: glLoadTransposeMatrixf(tex_matrix[0]); nuclear@0: } else { nuclear@0: glDisable(GL_TEXTURE_2D); nuclear@0: } nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glMultTransposeMatrixf(matrix[0]); nuclear@0: nuclear@0: float dcol[] = {mtl.diffuse.x, mtl.diffuse.y, mtl.diffuse.z, mtl.alpha}; nuclear@0: glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol); nuclear@0: float scol[] = {mtl.specular.x, mtl.specular.y, mtl.specular.z, 1.0f}; nuclear@0: glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol); nuclear@0: glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mtl.shininess); nuclear@0: nuclear@0: mesh->draw(); nuclear@0: nuclear@0: if(tex) { nuclear@0: glDisable(GL_TEXTURE_2D); nuclear@0: nuclear@0: glMatrixMode(GL_TEXTURE); nuclear@0: glPopMatrix(); nuclear@0: } nuclear@0: nuclear@0: if(sdr) { nuclear@2: ::set_shader(0); nuclear@0: } nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPopMatrix(); nuclear@0: nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: void Object::draw_wire(const Vector4 &col) const nuclear@0: { nuclear@0: if(shadow_pass) return; nuclear@0: nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_LIGHTING); nuclear@0: glUseProgram(0); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glMultTransposeMatrixf(matrix[0]); nuclear@0: nuclear@0: glColor4f(col.x, col.y, col.z, col.w); nuclear@0: mesh->draw_wire(); nuclear@0: nuclear@0: glPopMatrix(); nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: void Object::draw_vertices(const Vector4 &col) const nuclear@0: { nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_LIGHTING); nuclear@0: glUseProgram(0); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glMultTransposeMatrixf(matrix[0]); nuclear@0: nuclear@0: glColor4f(col.x, col.y, col.z, col.w); nuclear@0: mesh->draw_vertices(); nuclear@0: nuclear@0: glPopMatrix(); nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: void Object::draw_normals(float len, const Vector4 &col) const nuclear@0: { nuclear@2: int cur_sdr; nuclear@2: glGetIntegerv(GL_CURRENT_PROGRAM, &cur_sdr); nuclear@2: glUseProgram(0); nuclear@2: nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_LIGHTING); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glMultTransposeMatrixf(matrix[0]); nuclear@0: nuclear@0: glColor4f(col.x, col.y, col.z, col.w); nuclear@0: mesh->set_vis_vecsize(len); nuclear@0: mesh->draw_normals(); nuclear@0: nuclear@0: glPopMatrix(); nuclear@0: glPopAttrib(); nuclear@2: nuclear@2: glUseProgram(cur_sdr); nuclear@0: } nuclear@0: nuclear@0: void Object::draw_tangents(float len, const Vector4 &col) const nuclear@0: { nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_LIGHTING); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glMultTransposeMatrixf(matrix[0]); nuclear@0: nuclear@0: glColor4f(col.x, col.y, col.z, col.w); nuclear@0: mesh->set_vis_vecsize(len); nuclear@0: mesh->draw_tangents(); nuclear@0: nuclear@0: glPopMatrix(); nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: bool Object::intersect(const Ray &ray, HitPoint *hit) const nuclear@0: { nuclear@0: return false; // TODO nuclear@0: }