55 #define WIN32_LEAN_AND_MEAN 1 69 Stg::Visualizer(
"Graphics",
"custom_vis") {
73 for (queuemap::iterator itr = ClientDisplayLists.begin(); itr
74 != ClientDisplayLists.end(); ++itr)
75 RemoveDisplayList(itr->second);
80 glGetIntegerv(GL_DEPTH_FUNC, &OldDepthFunc);
81 glDepthFunc(GL_LEQUAL);
82 for (queuemap::iterator itr = ClientDisplayLists.begin(); itr
83 != ClientDisplayLists.end(); ++itr) {
85 glTranslatef(0, 0, 0.01);
86 glCallList(itr->second.DisplayList);
89 glDepthFunc(OldDepthFunc);
92 void Clear(MessageQueue * client) {
101 queuemap::iterator found = ClientDisplayLists.find(client);
102 if (found == ClientDisplayLists.end())
104 else if (found->second.DisplayList == -1)
110 queuemap::iterator found = ClientDisplayLists.find(client);
111 if (found == ClientDisplayLists.end())
117 else if (found->second.DisplayList == -1)
119 return found->second;
126 for (vector<Message>::iterator itr = list.
RenderItems.begin(); itr
138 virtual void AppendItem(MessageQueue * client, Message & item) {
155 if (HasActiveDisplayList(queue.get()))
158 RemoveDisplayList(list);
160 ClientDisplayLists.erase(queue.get());
164 glColor4f(static_cast<float> (colour.red) / 255.0,
165 static_cast<float> (colour.green) / 255.0,
166 static_cast<float> (colour.blue) / 255.0, 1
167 - static_cast<float> (colour.alpha) / 255.0);
170 virtual void RenderItem(Message & item) = 0;
173 typedef map<MessageQueue *, struct clientDisplaylist>
queuemap;
187 void RenderItem(Message & item);
200 void RenderItem(Message & item);
204 StgDriver* driver, ConfigFile* cf,
int section) :
224 player_msghdr_t* hdr,
void* data) {
225 if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
226 PLAYER_GRAPHICS2D_CMD_CLEAR, this->
addr)) {
231 if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
232 PLAYER_GRAPHICS2D_CMD_POINTS, this->
addr)
233 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
234 PLAYER_GRAPHICS2D_CMD_POLYLINE, this->
addr)
235 #ifdef PLAYER_GRAPHICS2D_CMD_MULTILINE 236 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
237 PLAYER_GRAPHICS2D_CMD_MULTILINE, this->
addr)
239 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
240 PLAYER_GRAPHICS2D_CMD_POLYGON, this->
addr)) {
241 Message msg(*hdr, data);
247 PLAYER_WARN2(
"stage graphics2d doesn't support message %d:%d.", hdr->type,
253 glDepthMask(GL_FALSE);
254 int type = item.GetHeader()->subtype;
256 case PLAYER_GRAPHICS2D_CMD_POINTS: {
257 player_graphics2d_cmd_points_t
259 *
reinterpret_cast<player_graphics2d_cmd_points_t*
> (item.GetPayload());
260 glPlayerColour(data.color);
262 for (
unsigned ii = 0; ii < data.points_count; ++ii)
263 glVertex3f(data.points[ii].px, data.points[ii].py, 0);
267 case PLAYER_GRAPHICS2D_CMD_POLYLINE: {
268 player_graphics2d_cmd_polyline_t
270 *
reinterpret_cast<player_graphics2d_cmd_polyline_t*
> (item.GetPayload());
271 glPlayerColour(data.color);
272 glBegin(GL_LINE_STRIP);
273 for (
unsigned ii = 0; ii < data.points_count; ++ii)
274 glVertex3f(data.points[ii].px, data.points[ii].py, 0);
279 #ifdef PLAYER_GRAPHICS2D_CMD_MULTILINE 280 case PLAYER_GRAPHICS2D_CMD_MULTILINE: {
281 player_graphics2d_cmd_multiline_t
283 *
reinterpret_cast<player_graphics2d_cmd_multiline_t*
> (item.GetPayload());
284 glPlayerColour(data.color);
286 for (
unsigned ii = 0; ii < data.points_count; ++ii)
287 glVertex3f(data.points[ii].px, data.points[ii].py, 0);
298 case PLAYER_GRAPHICS2D_CMD_POLYGON: {
299 player_graphics2d_cmd_polygon_t
301 *
reinterpret_cast<player_graphics2d_cmd_polygon_t*
> (item.GetPayload());
303 glPlayerColour(data.fill_color);
305 for (
unsigned ii = 0; ii < data.points_count; ++ii)
306 glVertex3f(data.points[ii].px, data.points[ii].py, 0);
309 glPlayerColour(data.color);
310 glBegin(GL_LINE_LOOP);
311 for (
unsigned ii = 0; ii < data.points_count; ++ii)
312 glVertex3f(data.points[ii].px, data.points[ii].py, 0);
317 glDepthMask(GL_TRUE);
342 player_msghdr_t* hdr,
void* data) {
343 if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
344 PLAYER_GRAPHICS3D_CMD_CLEAR, this->
addr)) {
349 if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
350 PLAYER_GRAPHICS3D_CMD_PUSH, this->
addr) || Message::MatchMessage(
351 hdr, PLAYER_MSGTYPE_CMD, PLAYER_GRAPHICS3D_CMD_POP, this->
addr)
352 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
353 PLAYER_GRAPHICS3D_CMD_DRAW, this->
addr)
354 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
355 PLAYER_GRAPHICS3D_CMD_TRANSLATE, this->
addr)
356 || Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD,
357 PLAYER_GRAPHICS3D_CMD_ROTATE, this->
addr)) {
358 Message msg(*hdr, data);
364 PLAYER_WARN2(
"stage graphics2d doesn't support message %d:%d.", hdr->type,
370 int type = item.GetHeader()->subtype;
372 case PLAYER_GRAPHICS3D_CMD_DRAW: {
373 player_graphics3d_cmd_draw_t
375 *
reinterpret_cast<player_graphics3d_cmd_draw_t*
> (item.GetPayload());
376 glPlayerColour(data.color);
377 switch (data.draw_mode) {
378 case PLAYER_DRAW_POINTS:
381 case PLAYER_DRAW_LINES:
384 case PLAYER_DRAW_LINE_STRIP:
385 glBegin(GL_LINE_STRIP);
387 case PLAYER_DRAW_LINE_LOOP:
388 glBegin(GL_LINE_LOOP);
390 case PLAYER_DRAW_TRIANGLES:
391 glBegin(GL_TRIANGLES);
393 case PLAYER_DRAW_TRIANGLE_STRIP:
394 glBegin(GL_TRIANGLE_STRIP);
396 case PLAYER_DRAW_TRIANGLE_FAN:
397 glBegin(GL_TRIANGLE_FAN);
399 case PLAYER_DRAW_QUADS:
402 case PLAYER_DRAW_QUAD_STRIP:
403 glBegin(GL_QUAD_STRIP);
405 case PLAYER_DRAW_POLYGON:
409 fprintf(stderr,
"Unknown graphics 3d draw mode\n");
412 for (
unsigned ii = 0; ii < data.points_count; ++ii)
413 glVertex3f(data.points[ii].px, data.points[ii].py,
418 case PLAYER_GRAPHICS3D_CMD_TRANSLATE: {
419 player_graphics3d_cmd_translate_t
421 *
reinterpret_cast<player_graphics3d_cmd_translate_t*
> (item.GetPayload());
422 glTranslatef(data.x, data.y, data.z);
425 case PLAYER_GRAPHICS3D_CMD_ROTATE: {
426 player_graphics3d_cmd_rotate_t
428 *
reinterpret_cast<player_graphics3d_cmd_rotate_t*
> (item.GetPayload());
429 glRotatef(data.a, data.x, data.y, data.z);
432 case PLAYER_GRAPHICS3D_CMD_PUSH: {
436 case PLAYER_GRAPHICS3D_CMD_POP: {
virtual ~PlayerGraphicsVis(void)
void RenderItem(Message &item)
queuemap ClientDisplayLists
virtual ~InterfaceGraphics2d(void)
virtual int ProcessMessage(QueuePointer &resp_queue, player_msghdr *hdr, void *data)
The Stage library uses its own namespace.
PlayerGraphics3dVis * vis
void BuildDisplayList(MessageQueue *client)
map< MessageQueue *, struct clientDisplaylist > queuemap
void RemoveVisualizer(Visualizer *custom_visual)
void RemoveDisplayList(struct clientDisplaylist &list)
void Unsubscribe(QueuePointer &queue)
bool HasActiveDisplayList(MessageQueue *client)
struct clientDisplaylist & GetDisplayList(MessageQueue *client)
virtual void Unsubscribe(void)
virtual int ProcessMessage(QueuePointer &resp_queue, player_msghdr *hdr, void *data)
InterfaceGraphics2d(player_devaddr_t addr, StgDriver *driver, ConfigFile *cf, int section)
void Clear(MessageQueue *client)
void RenderItem(Message &item)
virtual void Visualize(Stg::Model *mod, Stg::Camera *cam)
void AddVisualizer(Visualizer *custom_visual, bool on_by_default)
virtual ~InterfaceGraphics3d(void)
InterfaceGraphics3d(player_devaddr_t addr, StgDriver *driver, ConfigFile *cf, int section)
void glPlayerColour(const player_color_t &colour)
virtual void Subscribe(void)
PlayerGraphics2dVis * vis
virtual void AppendItem(MessageQueue *client, Message &item)
void Subscribe(QueuePointer &queue)
vector< Message > RenderItems