--
[physik/morpheus.git] / display.c
1 /*
2  * display.c - visualization api
3  *
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #include "defines.h"
10
11 int display_init(u32 x,u32 y,u32 z,display *display,cell *cell,int *argc,char **argv)
12 {
13 #ifdef USE_DFB_API
14  DFBSurfaceDescription surface_dsc;
15  DFBFontDescription font_dsc;
16 #endif
17
18  /* store dimensions */
19  display->max_x=x;
20  display->max_y=y;
21  display->max_z=z;
22  /* store pointer to cells */
23  display->cell_p=cell;
24
25  /* the api(s) */
26 #ifdef USE_DFB_API
27  DirectFBInit(argc,&argv);
28  DirectFBCreate(&(display->dfb));
29  display->dfb->SetCooperativeLevel(display->dfb,DFSCL_FULLSCREEN);
30  surface_dsc.flags=DSDESC_CAPS;
31  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
32  display->dfb->CreateSurface(display->dfb,&surface_dsc,&(display->primary_surface));
33  display->primary_surface->GetSize(display->primary_surface,&(display->screen_width),&(display->screen_height));
34  font_dsc.flags=DFDESC_HEIGHT;
35  font_dsc.height=display->max_y*(display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE))/10;
36  display->dfb->CreateFont(display->dfb,DISPLAY_FONT,&font_dsc,&(display->font));
37  display->primary_surface->SetFont(display->primary_surface,display->font);
38 #endif
39  return 23;
40 }
41
42 int display_release(display *display)
43 {
44 #ifdef USE_DFB_API
45  display->font->Release(display->font);
46  display->primary_surface->Release(display->primary_surface);
47  display->dfb->Release(display->dfb);
48 #endif
49
50  return 23;
51 }
52
53 #ifdef USE_DFB_API
54 int dfb_choose_color(cell *cell_p,unsigned char *r,unsigned char *g,unsigned char *b)
55 {
56  if(cell_p->status&AMORPH)
57  {
58   *r=0xff;
59   *g=0x00;
60   *b=0x00;
61  } else
62  {
63   *r=0x00;
64   *g=0x00;
65   *b=0xff;
66  }
67  return 23;
68 }
69 #endif
70
71 int display_draw(display *display,u32 x,u32 y,u32 z)
72 {
73 #ifdef USE_DFB_API
74  int menu_x,menu_y,menu_w,menu_h; /* for the yellow box */
75  char text[MAX_TXT];
76  u32 x_c,y_c,z_c;
77  unsigned char r,g,b,a;
78  int display_faktor_x,display_faktor_y;
79  a=0xff; /* no alpha blending */
80  if(((display->max_x+display->max_y+DISPLAY_X_FREE)>=display->screen_width)|
81     ((display->max_y+display->max_z+DISPLAY_Y_FREE)>=display->screen_height))
82  {
83   puts("resolution too low!");
84   return -23;
85  }
86  display_faktor_x=display->screen_width/(display->max_x+display->max_y+DISPLAY_X_FREE);
87  display_faktor_y=display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE);
88  // if(display_faktor_x<display_faktor_y) display_faktor_y=display_faktor_x;
89  // if(display_faktor_y<display_faktor_x) display_faktor_x=display_faktor_y;
90
91  /* draw x-z surface */
92  y_c=y;
93  for(x_c=0;x_c<display->max_x;x_c++)
94  {
95   for(z_c=0;z_c<display->max_z;z_c++)
96   {
97    dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
98    if(x_c==x && z_c==z)
99     display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
100    else
101     display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
102    display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
103   }
104  }
105  /* draw y-z surface */
106  x_c=x;
107  for(y_c=0;y_c<display->max_y;y_c++)
108  {
109   for(z_c=0;z_c<display->max_z;z_c++)
110   {
111    dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
112    if(y_c==y && z_c==z)
113     display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
114    else
115     display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
116    display->primary_surface->DrawRectangle(display->primary_surface,(y_c+display->max_x)*display_faktor_x+2*DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
117   }
118  }
119  /* draw x-y surface */
120  z_c=z;
121  for(x_c=0;x_c<display->max_x;x_c++)
122  {
123   for(y_c=0;y_c<display->max_y;y_c++)
124   {
125    dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
126    if(x_c==x && y_c==y)
127     display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
128    else
129     display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
130    display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,(y_c+display->max_z)*display_faktor_y+2*DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
131   }
132  }
133  /* display info window */
134  r=0xff;
135  g=0xff;
136  b=0x00;
137  a=0xff;
138  menu_x=2*DISPLAY_X_FREE/3+display->max_x*display_faktor_x;
139  menu_y=2*DISPLAY_Y_FREE/3+display->max_z*display_faktor_y;
140  menu_w=display->max_y*display_faktor_x;
141  menu_h=display->max_y*display_faktor_y;
142  display->primary_surface->SetColor(display->primary_surface,0,0,0,0);
143  display->primary_surface->FillRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
144  display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
145  display->primary_surface->DrawRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
146  display->primary_surface->DrawLine(display->primary_surface,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y*display->max_y-display_faktor_y);
147  display->primary_surface->SetColor(display->primary_surface,0x80,0x80,0xff,0xff);
148  sprintf(text,"x: %u",x);
149  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT);
150  sprintf(text,"y: %u",y);
151  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*2+menu_h/10*2,DSTF_LEFT);
152  sprintf(text,"z: %u",z);
153  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*3+menu_h/10*3,DSTF_LEFT);
154  sprintf(text,"status: %c",((display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y))->status&AMORPH?'a':'c');
155  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*5+menu_h/10*5,DSTF_LEFT);
156  sprintf(text,"c conc.: %u",(display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y)->conc);
157  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*6+menu_h/10*6,DSTF_LEFT);
158  sprintf(text,"step: %d",display->step);
159  display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x*display->max_x/2+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT);
160  /* flip all to surface */
161  display->primary_surface->Flip(display->primary_surface,NULL,0);
162 #endif
163  return 23;
164 }
165
166 int display_event_init(display *display)
167 {
168 #ifdef USE_DFB_API
169  display->dfb->GetInputDevice(display->dfb,DIDID_KEYBOARD,&(display->keyboard));
170  display->keyboard->CreateEventBuffer(display->keyboard,&(display->keyboard_buffer));
171 #endif
172  return 23;
173 }
174
175 int display_scan_event(display *display,u32 *x,u32 *y,u32 *z,int *quit)
176 {
177  DFBInputEvent keyboard_event;
178  display->keyboard_buffer->WaitForEvent(display->keyboard_buffer);
179  display->keyboard_buffer->GetEvent(display->keyboard_buffer,DFB_EVENT(&keyboard_event));
180  if(keyboard_event.type==DIET_KEYPRESS)
181  {
182   if(keyboard_event.key_id==DIKI_LEFT && *x!=0) *x-=1;
183   if(keyboard_event.key_id==DIKI_RIGHT && *x!=display->max_x-1) *x+=1;
184   if(keyboard_event.key_id==DIKI_DOWN && *y!=0) *y-=1;
185   if(keyboard_event.key_id==DIKI_UP && *y!=display->max_y-1) *y+=1;
186   if(keyboard_event.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
187   if(keyboard_event.key_id==DIKI_PAGE_DOWN && *z!=display->max_z-1) *z+=1;
188   if(keyboard_event.key_id==DIKI_Q) *quit=1;
189  }
190  return 23;
191 }