36 using namespace mondschein;
37 using namespace renderer;
39 GL13::GL13() :
Renderer(), renderstack()
49 void GL13::set_renderstack(
const std::list<Renderable_c> &_rs)
55 std::list<Renderable_c> GL13::get_renderstack()
const
65 if (_feature ==
"2D Texturing") glEnable(GL_TEXTURE_2D);
66 else if (_feature ==
"Depth Test") glEnable(GL_DEPTH);
67 else if (_feature ==
"Colour Material") glEnable(GL_COLOR_MATERIAL);
68 else if (_feature ==
"Vertex Lighting") glEnable(GL_LIGHTING);
72 if (_feature ==
"2D_Texturing") glDisable(GL_TEXTURE_2D);
73 else if (_feature ==
"Depth_Test") glDisable(GL_DEPTH);
74 else if (_feature ==
"Colour Material") glDisable(GL_COLOR_MATERIAL);
75 else if (_feature ==
"Vertex Lighting") glDisable(GL_LIGHTING);
83 glClearColor(_color(0),_color(1),_color(2),_color(3));
90 glClear(GL_COLOR_BUFFER_BIT);
97 glClear(GL_DEPTH_BUFFER_BIT);
103 return std::string(
"GL13");
110 glNewList(dsp,GL_COMPILE);
111 glViewport(_c.
x,_c.
y,_c.
w,_c.
h);
112 glMatrixMode(GL_PROJECTION);
116 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
118 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Display_List_c(
new GL13_Display_List(dsp))));
127 glNewList(dsp,GL_COMPILE);
129 glLightfv(GL_LIGHT0+_l.
unit,GL_AMBIENT,v);
131 glLightfv(GL_LIGHT0+_l.
unit,GL_DIFFUSE,v);
133 glLightfv(GL_LIGHT0+_l.
unit,GL_SPECULAR,v);
135 glLightfv(GL_LIGHT0+_l.
unit,GL_POSITION,v);
137 glLightfv(GL_LIGHT0+_l.
unit,GL_SPOT_DIRECTION,v);
138 glLightf(GL_LIGHT0+_l.
unit,GL_SPOT_CUTOFF,_l.
cutoff);
139 glLightf(GL_LIGHT0+_l.
unit,GL_SPOT_EXPONENT,_l.
exponent);
144 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
146 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Display_List_c(
new GL13_Display_List(dsp))));
158 glNewList(dsp,GL_COMPILE);
160 glMaterialfv(GL_FRONT,GL_AMBIENT,amb_array);
161 glMaterialfv(GL_FRONT,GL_DIFFUSE,dif_array);
162 glMaterialfv(GL_FRONT,GL_SPECULAR,spc_array);
163 glMaterialfv(GL_FRONT,GL_EMISSION,emi_array);
164 glMaterialf(GL_FRONT,GL_SHININESS,_m.
shininess);
166 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
168 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Display_List_c(
new GL13_Display_List(dsp))));
184 for (
uint32 i=0; i<vs; ++i) v[i]=_m.
v.at(i/4)(i%4);
185 for (
uint32 j=0; j<vns; ++j) vn[j]=_m.
vn.at(j/3)(j%3);
186 for (
uint32 k=0; k<vts; ++k) vt[k]=_m.
vt.at(k/4)(k%4);
187 for (
uint32 l=0; l<vcs; ++l) vc[l]=_m.
vc.at(l/4)(l%4);
188 glNewList(dsp,GL_COMPILE);
189 glClientActiveTexture(GL_TEXTURE0);
190 glVertexPointer(4,GL_DOUBLE,0,v);
191 glNormalPointer(GL_DOUBLE,0,vn);
192 glTexCoordPointer(4,GL_DOUBLE,0,vt);
193 glColorPointer(4,GL_DOUBLE,0,vc);
194 glEnableClientState(GL_VERTEX_ARRAY);
195 glEnableClientState(GL_NORMAL_ARRAY);
196 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
197 glEnableClientState(GL_COLOR_ARRAY);
198 glDrawArrays(GL_TRIANGLES,0,_m.
v.size());
200 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
202 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Display_List_c(
new GL13_Display_List(dsp))));
207 void GL13::create_pose(
const std::string& _id,
const Eigen::Matrix4d& _m)
209 std::array<float64,16> pose;
210 for (
uint32 i=0; i<16; ++i) pose.at(i)=_m(i%4,i/4);
211 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
213 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Pose_c(
new GL13_Pose(pose))));
222 glGenTextures(1,&tex);
223 int32 max_tex_units=0;
224 glGetIntegerv(GL_MAX_TEXTURE_UNITS,&max_tex_units);
225 if ( _t.
unit >= max_tex_units)
227 std::string err(
"Mondschein Engine ERROR: ");
228 err+=
"This OpenGL implementation only supports ";
230 err+=
" texture units. Exception raised in function\n\t";
231 err+=
"void mondschein::renderer::GL13::create_texture(const std::string& _id,const texture_attribs_t& _t)";
236 glActiveTexture(GL_TEXTURE0);
237 glBindTexture(GL_TEXTURE_2D,tex);
242 if (_t.
rgb) format=GL_RGBA;
247 if (_t.
rgb) format=GL_RGB;
252 std::string err(
"Mondschein Engine ERROR: Texture format not supported. ");
253 err+=
"Exception raised in function\n\t";
254 err+=
"void mondschein::renderer::GL13::create_texture(const std::string& _id,const texture_attribs_t& _t)";
261 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
262 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
267 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
268 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
273 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
274 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
278 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
279 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
284 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
285 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
289 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
290 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
294 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
295 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
298 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
299 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
303 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
304 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
308 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
309 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
313 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
314 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
318 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
319 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
323 std::string err(
"Mondschein Engine ERROR: Texture filtering mode not supported. Exception raised in function\n\t");
324 err+=
"void mondschein::renderer::GL13::create_texture(const std::string& _id,const texture_attribs_t& _t)";
330 gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,_t.
width,_t.
height,format,GL_UNSIGNED_BYTE,_t.
data.data());
331 std::map<std::string,Renderable_c> r=
get_context()->get_renderables();
333 r.insert(std::make_pair<const std::string&,Renderable_c>(_id,GL13_Texture_c(
new GL13_Texture(tex,unit))));
342 scene::Light_c light;
343 scene::Material_c mat;
346 scene::Texture_c tex;
347 if ((cam=boost::dynamic_pointer_cast<const scene::Camera>(_sn)).
get()!=
nullptr)
348 create_camera(cam->get_id(),cam->get_camera_attribs());
349 else if ((light=boost::dynamic_pointer_cast<const scene::Light>(_sn)).get()!=
nullptr)
350 create_light(light->get_id(),light->get_light_attribs());
351 else if ((mat=boost::dynamic_pointer_cast<const scene::Material>(_sn)).get()!=
nullptr)
352 create_material(mat->get_id(),mat->get_material_attribs());
353 else if ((mesh=boost::dynamic_pointer_cast<const scene::Mesh>(_sn)).get()!=
nullptr)
354 create_mesh(mesh->get_id(),mesh->get_mesh_attribs());
355 else if ((pose=boost::dynamic_pointer_cast<const scene::Pose>(_sn)).get()!=
nullptr)
356 create_pose(pose->get_id(),pose->get_matrix());
357 else if ((tex=boost::dynamic_pointer_cast<const scene::Texture>(_sn)).get()!=
nullptr)
358 create_texture(tex->get_id(),tex->get_texture_attribs());
361 std::string err(
"Mondschein Engine ERROR: Scenenode type is not supported by this renderer. ");
362 err+=
"Exception raised in function\n\t";
363 err+=
"std::pair<std::string,mondschein::renderer::Renderable_c> mondschein::renderer:GL13::make_renderable(";
364 err+=
"mondschein::scene::Scenenode_c _sn)";
373 boost::adjacency_list<> g=_sg->get_scenegraph_attribs().edges;
374 std::pair<adj_it,adj_it> range=boost::adjacent_vertices(_start,g);
375 std::map<std::string,Renderable_c> objects=
get_context()->get_renderables();
376 scene::Scenenode_c sn=_sg->get_scenegraph_attribs().nodes.at(_start);
377 if (boost::dynamic_pointer_cast<const scene::Camera>(sn).
get()!=
nullptr)
379 Renderable_c obj=objects.at(sn->get_id());
381 renderstack.push_back(obj);
382 render_children(_sg,range);
383 renderstack.pop_back();
384 if (!renderstack.empty()) renderstack.back()->render();
386 else if (boost::dynamic_pointer_cast<const scene::Light>(sn).
get()!=
nullptr)
388 Renderable_c obj=objects.at(sn->get_id());
390 renderstack.push_back(obj);
391 render_children(_sg,range);
392 renderstack.pop_back();
393 if (!renderstack.empty()) renderstack.back()->render();
395 else if (boost::dynamic_pointer_cast<const scene::Material>(sn).
get()!=
nullptr)
397 Renderable_c obj=objects.at(sn->get_id());
399 renderstack.push_back(obj);
400 render_children(_sg,range);
401 renderstack.pop_back();
402 if (!renderstack.empty()) renderstack.back()->render();
404 else if (boost::dynamic_pointer_cast<const scene::Mesh>(sn).
get()!=
nullptr)
406 Renderable_c obj=objects.at(sn->get_id());
408 render_children(_sg,range);
410 else if (boost::dynamic_pointer_cast<const scene::Pose>(sn).
get()!=
nullptr)
412 Renderable_c obj=objects.at(sn->get_id());
413 glMatrixMode(GL_MODELVIEW);
416 render_children(_sg,range);
417 glMatrixMode(GL_MODELVIEW);
420 else if (boost::dynamic_pointer_cast<const scene::Texture>(sn).
get()!=
nullptr)
422 Renderable_c obj=objects.at(sn->get_id());
424 renderstack.push_back(obj);
425 render_children(_sg,range);
426 renderstack.pop_back();
427 if (!renderstack.empty()) renderstack.back()->render();
431 std::string err(
"Mondschein Engine ERROR: This scene node cannot be rendered by this renderer.");
432 err+=
" Exception raised in function\n\t";
433 err+=
"void mondschein::renderer::GL13::render(mondschein::scene::Scenegraph_c _sg,const uint32 _start)";
439 void GL13::render_children(scene::Scenegraph_c _sg,std::pair<adj_it,adj_it> _c)
441 for (; _c.first!=_c.second; ++_c.first)
GL13::render(_sg,*_c.first);