ld33_umonster

annotate src/object.cc @ 0:4a6683050e29

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 22 Aug 2015 07:15:00 +0300
parents
children 35349df5392d
rev   line source
nuclear@0 1 #include "object.h"
nuclear@0 2 #include "opengl.h"
nuclear@0 3 #include "shadow.h"
nuclear@0 4
nuclear@0 5 Material::Material()
nuclear@0 6 : diffuse(1, 1, 1), specular(0, 0, 0)
nuclear@0 7 {
nuclear@0 8 shininess = 60.0;
nuclear@0 9 alpha = 1.0;
nuclear@0 10 }
nuclear@0 11
nuclear@0 12 RenderOps::RenderOps()
nuclear@0 13 {
nuclear@0 14 zwrite = true;
nuclear@0 15 cast_shadows = true;
nuclear@0 16 transparent = false;
nuclear@0 17 }
nuclear@0 18
nuclear@0 19 void RenderOps::setup() const
nuclear@0 20 {
nuclear@0 21 if(!zwrite) {
nuclear@0 22 glDepthMask(0);
nuclear@0 23 }
nuclear@0 24 if(transparent) {
nuclear@0 25 glEnable(GL_BLEND);
nuclear@0 26 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
nuclear@0 27 } else {
nuclear@0 28 glDisable(GL_BLEND);
nuclear@0 29 }
nuclear@0 30 }
nuclear@0 31
nuclear@0 32 Object::Object()
nuclear@0 33 {
nuclear@0 34 mesh = 0;
nuclear@0 35 tex = 0;
nuclear@0 36 sdr = 0;
nuclear@0 37 }
nuclear@0 38
nuclear@0 39 Object::~Object()
nuclear@0 40 {
nuclear@0 41 delete mesh;
nuclear@0 42 }
nuclear@0 43
nuclear@0 44 Matrix4x4 &Object::xform()
nuclear@0 45 {
nuclear@0 46 return matrix;
nuclear@0 47 }
nuclear@0 48
nuclear@0 49 const Matrix4x4 &Object::xform() const
nuclear@0 50 {
nuclear@0 51 return matrix;
nuclear@0 52 }
nuclear@0 53
nuclear@0 54 Matrix4x4 &Object::tex_xform()
nuclear@0 55 {
nuclear@0 56 return tex_matrix;
nuclear@0 57 }
nuclear@0 58
nuclear@0 59 const Matrix4x4 &Object::tex_xform() const
nuclear@0 60 {
nuclear@0 61 return tex_matrix;
nuclear@0 62 }
nuclear@0 63
nuclear@0 64 void Object::set_mesh(Mesh *m)
nuclear@0 65 {
nuclear@0 66 this->mesh = m;
nuclear@0 67 }
nuclear@0 68
nuclear@0 69 Mesh *Object::get_mesh() const
nuclear@0 70 {
nuclear@0 71 return mesh;
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 void Object::set_texture(unsigned int tex)
nuclear@0 75 {
nuclear@0 76 this->tex = tex;
nuclear@0 77 }
nuclear@0 78
nuclear@0 79 void Object::set_shader(unsigned int sdr)
nuclear@0 80 {
nuclear@0 81 if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) {
nuclear@0 82 this->sdr = sdr;
nuclear@0 83 }
nuclear@0 84 }
nuclear@0 85
nuclear@0 86 unsigned int Object::get_shader() const
nuclear@0 87 {
nuclear@0 88 return sdr;
nuclear@0 89 }
nuclear@0 90
nuclear@0 91 void Object::draw() const
nuclear@0 92 {
nuclear@0 93 if(!mesh) return;
nuclear@0 94
nuclear@0 95 if(shadow_pass && !rop.cast_shadows) {
nuclear@0 96 return;
nuclear@0 97 }
nuclear@0 98
nuclear@0 99 glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT);
nuclear@0 100 rop.setup();
nuclear@0 101
nuclear@0 102 if(glcaps.shaders) {
nuclear@0 103 if(sdr) {
nuclear@0 104 if(!shadow_pass) {
nuclear@0 105 glUseProgram(sdr);
nuclear@0 106 }
nuclear@0 107 } else {
nuclear@0 108 glUseProgram(0);
nuclear@0 109 }
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 if(tex) {
nuclear@0 113 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@0 114 glEnable(GL_TEXTURE_2D);
nuclear@0 115
nuclear@0 116 glMatrixMode(GL_TEXTURE);
nuclear@0 117 glPushMatrix();
nuclear@0 118 glLoadTransposeMatrixf(tex_matrix[0]);
nuclear@0 119 } else {
nuclear@0 120 glDisable(GL_TEXTURE_2D);
nuclear@0 121 }
nuclear@0 122
nuclear@0 123 glMatrixMode(GL_MODELVIEW);
nuclear@0 124 glPushMatrix();
nuclear@0 125 glMultTransposeMatrixf(matrix[0]);
nuclear@0 126
nuclear@0 127 float dcol[] = {mtl.diffuse.x, mtl.diffuse.y, mtl.diffuse.z, mtl.alpha};
nuclear@0 128 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol);
nuclear@0 129 float scol[] = {mtl.specular.x, mtl.specular.y, mtl.specular.z, 1.0f};
nuclear@0 130 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol);
nuclear@0 131 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mtl.shininess);
nuclear@0 132
nuclear@0 133 mesh->draw();
nuclear@0 134
nuclear@0 135 if(tex) {
nuclear@0 136 glDisable(GL_TEXTURE_2D);
nuclear@0 137
nuclear@0 138 glMatrixMode(GL_TEXTURE);
nuclear@0 139 glPopMatrix();
nuclear@0 140 }
nuclear@0 141
nuclear@0 142 if(sdr) {
nuclear@0 143 glUseProgram(0);
nuclear@0 144 }
nuclear@0 145
nuclear@0 146 glMatrixMode(GL_MODELVIEW);
nuclear@0 147 glPopMatrix();
nuclear@0 148
nuclear@0 149 glPopAttrib();
nuclear@0 150 }
nuclear@0 151
nuclear@0 152 void Object::draw_wire(const Vector4 &col) const
nuclear@0 153 {
nuclear@0 154 if(shadow_pass) return;
nuclear@0 155
nuclear@0 156 glPushAttrib(GL_ENABLE_BIT);
nuclear@0 157 glDisable(GL_LIGHTING);
nuclear@0 158 glUseProgram(0);
nuclear@0 159
nuclear@0 160 glMatrixMode(GL_MODELVIEW);
nuclear@0 161 glPushMatrix();
nuclear@0 162 glMultTransposeMatrixf(matrix[0]);
nuclear@0 163
nuclear@0 164 glColor4f(col.x, col.y, col.z, col.w);
nuclear@0 165 mesh->draw_wire();
nuclear@0 166
nuclear@0 167 glPopMatrix();
nuclear@0 168 glPopAttrib();
nuclear@0 169 }
nuclear@0 170
nuclear@0 171 void Object::draw_vertices(const Vector4 &col) const
nuclear@0 172 {
nuclear@0 173 glPushAttrib(GL_ENABLE_BIT);
nuclear@0 174 glDisable(GL_LIGHTING);
nuclear@0 175 glUseProgram(0);
nuclear@0 176
nuclear@0 177 glMatrixMode(GL_MODELVIEW);
nuclear@0 178 glPushMatrix();
nuclear@0 179 glMultTransposeMatrixf(matrix[0]);
nuclear@0 180
nuclear@0 181 glColor4f(col.x, col.y, col.z, col.w);
nuclear@0 182 mesh->draw_vertices();
nuclear@0 183
nuclear@0 184 glPopMatrix();
nuclear@0 185 glPopAttrib();
nuclear@0 186 }
nuclear@0 187
nuclear@0 188 void Object::draw_normals(float len, const Vector4 &col) const
nuclear@0 189 {
nuclear@0 190 glPushAttrib(GL_ENABLE_BIT);
nuclear@0 191 glDisable(GL_LIGHTING);
nuclear@0 192
nuclear@0 193 glMatrixMode(GL_MODELVIEW);
nuclear@0 194 glPushMatrix();
nuclear@0 195 glMultTransposeMatrixf(matrix[0]);
nuclear@0 196
nuclear@0 197 glColor4f(col.x, col.y, col.z, col.w);
nuclear@0 198 mesh->set_vis_vecsize(len);
nuclear@0 199 mesh->draw_normals();
nuclear@0 200
nuclear@0 201 glPopMatrix();
nuclear@0 202 glPopAttrib();
nuclear@0 203 }
nuclear@0 204
nuclear@0 205 void Object::draw_tangents(float len, const Vector4 &col) const
nuclear@0 206 {
nuclear@0 207 glPushAttrib(GL_ENABLE_BIT);
nuclear@0 208 glDisable(GL_LIGHTING);
nuclear@0 209
nuclear@0 210 glMatrixMode(GL_MODELVIEW);
nuclear@0 211 glPushMatrix();
nuclear@0 212 glMultTransposeMatrixf(matrix[0]);
nuclear@0 213
nuclear@0 214 glColor4f(col.x, col.y, col.z, col.w);
nuclear@0 215 mesh->set_vis_vecsize(len);
nuclear@0 216 mesh->draw_tangents();
nuclear@0 217
nuclear@0 218 glPopMatrix();
nuclear@0 219 glPopAttrib();
nuclear@0 220 }
nuclear@0 221
nuclear@0 222 bool Object::intersect(const Ray &ray, HitPoint *hit) const
nuclear@0 223 {
nuclear@0 224 return false; // TODO
nuclear@0 225 }