fltkhs-0.1.0.0: c-examples/cube.c
#include <config.h>
#include <Fl_C.h>
#include <Fl_WindowC.h>
#include <Fl_BoxC.h>
#include <Fl_ButtonC.h>
#include <Fl_Radio_Light_ButtonC.h>
#include <Fl_SliderC.h>
#include <Fl_Menu_ItemC.h>
#include <Fl_Gl_WindowC.h>
#include <stdlib.h>
#include <stdio.h>
#include <glC.h>
typedef struct instance_data {
double lasttime;
int wire;
double size;
double speed;
} instance_data;
/* The cube definition */
float v0[3] = {0.0, 0.0, 0.0};
float v1[3] = {1.0, 0.0, 0.0};
float v2[3] = {1.0, 1.0, 0.0};
float v3[3] = {0.0, 1.0, 0.0};
float v4[3] = {0.0, 0.0, 1.0};
float v5[3] = {1.0, 0.0, 1.0};
float v6[3] = {1.0, 1.0, 1.0};
float v7[3] = {0.0, 1.0, 1.0};
#define v3f(x) glVertex3fv(x)
void drawcube(int wire) {
/* Draw a colored cube */
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(0,0,255);
v3f(v0); v3f(v1); v3f(v2); v3f(v3);
glEnd();
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(0,255,255); v3f(v4); v3f(v5); v3f(v6); v3f(v7);
glEnd();
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(255,0,255); v3f(v0); v3f(v1); v3f(v5); v3f(v4);
glEnd();
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(255,255,0); v3f(v2); v3f(v3); v3f(v7); v3f(v6);
glEnd();
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(0,255,0); v3f(v0); v3f(v4); v3f(v7); v3f(v3);
glEnd();
glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
glColor3ub(255,0,0); v3f(v1); v3f(v2); v3f(v6); v3f(v5);
glEnd();
}
void draw(fl_Gl_Window cube) {
instance_data* cube_data = (instance_data*)Fl_Gl_Window_other_data(cube);
cube_data->lasttime = cube_data->lasttime+cube_data->speed;
Fl_Gl_Window_set_other_data(cube, cube_data);
if (!Fl_Gl_Window_valid(cube)) {
glLoadIdentity();
glViewport(0,0,Fl_Gl_Window_w(cube),Fl_Gl_Window_h(cube));
glEnable(GL_DEPTH_TEST);
glFrustum(-1,1,-1,1,2,10000);
glTranslatef(0,0,-10);
flc_gl_font(FL_HELVETICA_BOLD, 16 );
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef((float)(cube_data->lasttime*1.6),0,0,1);
glRotatef((float)(cube_data->lasttime*4.2),1,0,0);
glRotatef((float)(cube_data->lasttime*2.3),0,1,0);
glTranslatef(-1.0, 1.2f, -1.5);
glScalef((float)(cube_data->size),(float)(cube_data->size),(float)(cube_data->size));
drawcube(cube_data->wire);
glPopMatrix();
flc_gl_color(FL_GRAY);
glDisable(GL_DEPTH_TEST);
flc_gl_draw_with_xy(cube_data->wire ? "Cube: wire" : "Cube: flat", -4.5f, -4.5f );
glEnable(GL_DEPTH_TEST);
}
int handle(fl_Gl_Window cube_box, int e) {
switch (e) {
case FL_ENTER: Fl_Gl_Window_set_cursor(cube_box,FL_CURSOR_CROSS); break;
case FL_LEAVE: Fl_Gl_Window_set_cursor(cube_box,FL_CURSOR_DEFAULT); break;
}
return Fl_Gl_Window_handle_super(cube_box,e);
}
fl_Window form;
fl_Slider speed;
fl_Slider size;
fl_Button button;
fl_Button wire;
fl_Button flat;
fl_Gl_Window cube;
fl_Gl_Window cube2;
void makeform(fl_Gl_Window_Virtual_Funcs* cube_funcs, fl_Gl_Window_Virtual_Funcs* cube2_funcs) {
Fl_Window_begin(form);
Fl_Box_New_WithBoxtype(FL_DOWN_FRAME,20,20,350,350,"");
Fl_Box_New_WithBoxtype(FL_DOWN_FRAME,510,20,350,350,"");
speed = (fl_Slider)Fl_Slider_New_WithLabel(390,90,40,220,"Speed");
Fl_Slider_set_type(speed,FL_VERT_SLIDER);
size = (fl_Slider)Fl_Slider_New_WithLabel(450,90,40,220,"Size");
Fl_Slider_set_type(size,FL_VERT_SLIDER);
wire = (fl_Radio_Light_Button)Fl_Radio_Light_Button_New_WithLabel(390,20,100,30,"Wire");
flat = (fl_Radio_Light_Button)Fl_Radio_Light_Button_New_WithLabel(390,50,100,30,"Flat");
button = (fl_Button)Fl_Button_New_WithLabel(390,340,100,30,"Exit");
cube = (fl_Gl_Window)Fl_OverriddenGl_Window_NewXY_WithLabel(23,23,344,344, 0,cube_funcs);
cube2 = (fl_Gl_Window)Fl_OverriddenGl_Window_NewXY_WithLabel(513,23,344,344, 0,cube2_funcs);
instance_data* cube_data = (instance_data*)malloc(sizeof(instance_data));
cube_data->lasttime = 0.0;
instance_data* cube2_data = (instance_data*)malloc(sizeof(instance_data));
cube2_data->lasttime = 0.0;
Fl_Gl_Window_set_other_data(cube, cube_data);
Fl_Gl_Window_set_other_data(cube2, cube2_data);
int x = Fl_Gl_Window_x(cube);
int y = Fl_Slider_y(size);
int w = Fl_Gl_Window_w(cube);
int h = Fl_Slider_h(size);
fl_Box b = (fl_Box)Fl_Box_New_WithBoxtype(FL_NO_BOX,x,y,w,h,0);
Fl_Window_set_resizable(form,b);
Fl_Box_hide(b);
Fl_Window_end(form);
}
#include <Fl_Sys_Menu_BarC.h>
#include <Fl_PrinterC.h>
void print_cb(fl_Widget w, void* data)
{
fl_Printer printer = (fl_Printer) Fl_Printer_New();
fl_Window win = Fl_first_window();
if(!win) return;
if(Fl_Printer_start_job(printer,1) ) return;
if(Fl_Printer_start_page(printer)) return;
Fl_Printer_scale_with_scale_y(printer,0.5,0.5);
Fl_Printer_print_widget(printer, win );
Fl_Printer_end_page(printer);
Fl_Printer_end_job(printer);
}
int main(int argc, char **argv) {
fl_Gl_Window_Virtual_Funcs* cube_funcs = (fl_Gl_Window_Virtual_Funcs*)Fl_Gl_Window_default_virtual_funcs();
fl_Gl_Window_Virtual_Funcs* cube2_funcs =(fl_Gl_Window_Virtual_Funcs*)Fl_Gl_Window_default_virtual_funcs();
cube_funcs->draw = &draw;
cube_funcs->handle = &handle;
cube2_funcs->draw = &draw;
cube2_funcs->handle = &handle;
form = (fl_Window)Fl_Window_New_WithLabel(510+390,390,argv[0]);
makeform(cube_funcs, cube2_funcs);
Fl_Window_begin(form);
fl_Menu_Item i1 = (fl_Menu_Item)Fl_Menu_Item_New();
Fl_Menu_Item_set_label(i1,"Print");
Fl_Menu_Item_set_flags(i1,FL_SUBMENU);
fl_Menu_Item i2 = (fl_Menu_Item)Fl_Menu_Item_New();
Fl_Menu_Item_set_label(i2,"Print window");
Fl_Menu_Item_set_callback(i2,&print_cb);
fl_Menu_Item i3 = (fl_Menu_Item)Fl_Menu_Item_New();
fl_Menu_Item i4 = (fl_Menu_Item)Fl_Menu_Item_New();
fl_Menu_Item items[] = {i1,i2,i3,i4};
fl_Sys_Menu_Bar menubar_ = (fl_Sys_Menu_Bar)Fl_Sys_Menu_Bar_New(0,0,60,20);
Fl_Sys_Menu_Bar_set_box(menubar_,FL_FLAT_BOX);
Fl_Sys_Menu_Bar_menu_with_m(menubar_ ,items, 4);
Fl_Window_end(form);
instance_data* cube_data = (instance_data*)Fl_Gl_Window_other_data(cube);
instance_data* cube2_data = (instance_data*)Fl_Gl_Window_other_data(cube2);
cube_data->speed = 1.0;
cube2_data->speed = 1.0;
cube_data->size=1.0;
cube2_data->size=1.0;
cube_data->wire=0;
cube2_data->wire=1;
Fl_Gl_Window_set_other_data(cube, cube_data);
Fl_Gl_Window_set_other_data(cube2, cube2_data);
Fl_Window_begin(form);
Fl_Slider_bounds(speed,4,0);
Fl_Slider_set_value(speed,1.0);
Fl_Slider_bounds(size,4,0.01);
Fl_Slider_set_value(size,1.0);
Fl_Button_set_value(flat,1);
Fl_Window_set_label(form,"");
Fl_Window_end(form);
Fl_Window_show_with_args(form,argc,argv);
Fl_Gl_Window_show(cube);
Fl_Gl_Window_show(cube2);
for (;;) {
if (Fl_Window_visible(form) && Fl_Slider_value(speed))
{if (!Fl_check()) break;} // returns immediately
else
{if (!Fl_wait()) break;} // waits until something happens
instance_data* cube_data = (instance_data*)Fl_Gl_Window_other_data(cube);
instance_data* cube2_data = (instance_data*)Fl_Gl_Window_other_data(cube2);
cube_data->wire = Fl_Button_value(wire);
cube2_data->wire = !Fl_Button_value(wire);
cube_data->size = cube2_data->size = Fl_Slider_value(size);
cube_data->speed = cube2_data->speed = Fl_Slider_value(speed);
Fl_Gl_Window_set_other_data(cube, cube_data);
Fl_Gl_Window_set_other_data(cube2, cube2_data);
Fl_Gl_Window_redraw(cube);
Fl_Gl_Window_redraw(cube2);
if (Fl_readqueue() == button) break;
}
return 0;
}