tavli

view src/object.cc @ 14:283eb6e9f0a3

scenery
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 28 Jun 2015 07:44:23 +0300
parents a8e26f163f99
children b1a195c3ee16
line source
1 #include "object.h"
2 #include "opengl.h"
4 Material::Material()
5 : diffuse(1, 1, 1), specular(0, 0, 0)
6 {
7 shininess = 60.0;
8 alpha = 1.0;
9 }
11 RenderOps::RenderOps()
12 {
13 zwrite = true;
14 }
16 void RenderOps::setup() const
17 {
18 if(!zwrite) {
19 glDepthMask(0);
20 }
21 }
23 Object::Object()
24 {
25 mesh = 0;
26 tex = 0;
27 }
29 Object::~Object()
30 {
31 delete mesh;
32 }
34 Matrix4x4 &Object::xform()
35 {
36 return matrix;
37 }
39 const Matrix4x4 &Object::xform() const
40 {
41 return matrix;
42 }
44 Matrix4x4 &Object::tex_xform()
45 {
46 return tex_matrix;
47 }
49 const Matrix4x4 &Object::tex_xform() const
50 {
51 return tex_matrix;
52 }
54 void Object::set_mesh(Mesh *m)
55 {
56 this->mesh = m;
57 }
59 Mesh *Object::get_mesh() const
60 {
61 return mesh;
62 }
64 void Object::set_texture(unsigned int tex)
65 {
66 this->tex = tex;
67 }
69 void Object::draw() const
70 {
71 if(!mesh) return;
73 glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT);
74 rop.setup();
76 if(tex) {
77 glBindTexture(GL_TEXTURE_2D, tex);
78 glEnable(GL_TEXTURE_2D);
80 glMatrixMode(GL_TEXTURE);
81 glPushMatrix();
82 glLoadTransposeMatrixf(tex_matrix[0]);
83 } else {
84 glDisable(GL_TEXTURE_2D);
85 }
87 glMatrixMode(GL_MODELVIEW);
88 glPushMatrix();
89 glMultTransposeMatrixf(matrix[0]);
91 float dcol[] = {mtl.diffuse.x, mtl.diffuse.y, mtl.diffuse.z, mtl.alpha};
92 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol);
93 float scol[] = {mtl.specular.x, mtl.specular.y, mtl.specular.z, 1.0f};
94 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol);
95 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mtl.shininess);
97 mesh->draw();
99 if(tex) {
100 glDisable(GL_TEXTURE_2D);
102 glMatrixMode(GL_TEXTURE);
103 glPopMatrix();
104 }
106 glMatrixMode(GL_MODELVIEW);
107 glPopMatrix();
109 glPopAttrib();
110 }
112 void Object::draw_wire(const Vector4 &col) const
113 {
114 glPushAttrib(GL_ENABLE_BIT);
115 glDisable(GL_LIGHTING);
117 glMatrixMode(GL_MODELVIEW);
118 glPushMatrix();
119 glMultTransposeMatrixf(matrix[0]);
121 glColor4f(col.x, col.y, col.z, col.w);
122 mesh->draw_wire();
124 glPopMatrix();
125 glPopAttrib();
126 }
128 void Object::draw_vertices(const Vector4 &col) const
129 {
130 glPushAttrib(GL_ENABLE_BIT);
131 glDisable(GL_LIGHTING);
133 glMatrixMode(GL_MODELVIEW);
134 glPushMatrix();
135 glMultTransposeMatrixf(matrix[0]);
137 glColor4f(col.x, col.y, col.z, col.w);
138 mesh->draw_vertices();
140 glPopMatrix();
141 glPopAttrib();
142 }
144 void Object::draw_normals(float len, const Vector4 &col) const
145 {
146 glPushAttrib(GL_ENABLE_BIT);
147 glDisable(GL_LIGHTING);
149 glMatrixMode(GL_MODELVIEW);
150 glPushMatrix();
151 glMultTransposeMatrixf(matrix[0]);
153 glColor4f(col.x, col.y, col.z, col.w);
154 mesh->set_vis_vecsize(len);
155 mesh->draw_normals();
157 glPopMatrix();
158 glPopAttrib();
159 }
161 void Object::draw_tangents(float len, const Vector4 &col) const
162 {
163 glPushAttrib(GL_ENABLE_BIT);
164 glDisable(GL_LIGHTING);
166 glMatrixMode(GL_MODELVIEW);
167 glPushMatrix();
168 glMultTransposeMatrixf(matrix[0]);
170 glColor4f(col.x, col.y, col.z, col.w);
171 mesh->set_vis_vecsize(len);
172 mesh->draw_tangents();
174 glPopMatrix();
175 glPopAttrib();
176 }
178 bool Object::intersect(const Ray &ray, HitPoint *hit) const
179 {
180 return false; // TODO
181 }