plugins/crazychat/cc_features.c

changeset 14253
b63ebf84c42b
parent 14252
d10dda2777a9
child 14254
77edc7a6191a
--- a/plugins/crazychat/cc_features.c	Sat Aug 19 00:24:14 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,522 +0,0 @@
-#include <assert.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include "cc_interface.h"
-#include "crazychat.h"
-
-#include "Utilities.h"
-#include "QTUtilities.h"
-#include "camdata.h"
-#include "camproc.h"
-#include "util.h"
-#include <unistd.h>
-
-
-#ifdef __APPLE_CC__
-#include <Carbon/Carbon.h>
-#else
-#include <Carbon.h>
-#endif
-
-/* temporarily including for development testing */
-#include "cc_gtk_gl.h"
-
-/* hard coding the webcam dimensions: BAD, but we're not probing hardware yet */
-
-#define WEBCAM_X		644	/* webcam's x dim */
-#define WEBCAM_Y		480	/* webcam's y dim */
-
-/* default webcam timer callback delay */
-#define WEBCAM_CALLBACK_DELAY	40	/* in ms */
-
-int x_click, y_click;
-int mode_change=0;
-
-struct input_instance input_data;
-
-/* move this to input_instance eventually */
-/*
-UInt32 colorBuf[WEBCAM_Y][WEBCAM_X];
-*/
-unsigned int (*colorBuf)[640];
-int detection_mode=0;
-int draw_mode=0; //0=pixels, 1=face
-int easter_count;
-static void *kickstart(void *data);
-static void *facefind(void *data);
-
-/**
- * Resets the OpenGL viewport stuff on widget reconfiguration (resize,
- * reposition)
- * @param widget	widget that got reconfigured
- * @param event		the configuration event
- * @param data		unused
- * @return		TRUE ( i don't know what FALSE would do )
- */
-static gboolean config_wrapper(GtkWidget *widget, GdkEventConfigure *event,
-		void *data);
-
-/**
- * Debug features test.  Draws pixels directly to the frame buffer.
- * @param widget	widget that we're drawing
- * @param event		the draw event
- * @param data		array of pixels
- * @return		DUNNO
- */
-static gboolean mydraw(GtkWidget *widget, GdkEventExpose *event,
-			      void *data);
-
-/**
- * Periodically querys the webcam for more data.
- * @param instance	webcam input instance data
- * @return 		TRUE to stop other handler, FALSE to continue
- */
-static gboolean webcam_cb(struct input_instance *instance);
-
-/**
- * Init window code, adding our click callback.
- * @param widget	the window we clicked in
- * @param instance	webcam input instance data
- */
-static void init_cb(GtkWidget *widget, struct input_instance *instance);
-
-/**
- * Click callback
- * @param widget	the window we clicked in
- * @param event		the button click event structure
- * @param instance	input instance data
- * @return 		TRUE to stop other handler, FALSE to continue
- */
-static gboolean click_cb(GtkWidget *widget, GdkEventButton *event,
-		struct input_instance *instance);
-
-/**
- * Button callback
- * @param button	the button we clicked on
- * @param instance	input instance data
- */
-static void button_cb(GtkWidget *button, struct input_instance *instance);
-
-/**
- * Destroy callback.  Called when the input processing window is destroyed.
- * @param widget	the window we clicked in
- * @param cc		crazychat global data structure
- */
-static void destroy_cb(GtkWidget *widget, struct crazychat *cc);
-
-/**
- * Set feature material.
- * @param entry		model selector combo box entry
- * @param material	pointer to material we're setting
- */
-static void material_set(GtkWidget *entry, guint8 *material);
-
-struct input_instance *init_input(struct crazychat *cc)
-{
-
-  /*pthread_t userinput_t; // should we put this in a nicer wrapper?*/
-	struct draw_info *info;
-	struct input_instance *instance; 
-	info = (struct draw_info*)malloc(sizeof(*info));
-	assert(info);
-	memset(info, 0, sizeof(*info));
-	info->timeout = TRUE;
-	info->delay_ms = DEFAULT_FRAME_DELAY;
-	info->data = &input_data;
-	instance = (struct input_instance*)info->data;
-	memset(instance, 0, sizeof(*instance));
-	instance->output.features = &instance->face;
-	EnterMovies();
-	filter_bank *bank;
-	bank = Filter_Initialize();
-	assert(CamProc(instance, bank) == noErr); // change this prototype-> no windows
-	instance->timer_id = g_timeout_add(WEBCAM_CALLBACK_DELAY,
-		(GSourceFunc)webcam_cb, instance);
-	/*	THREAD_CREATE(&userinput_t, facefind, instance); // is this being created correctly?*/
-	struct window_box ret;
-	cc_new_gl_window(init_cb, config_wrapper, mydraw,
-			info, &ret);
-	instance->widget = ret.window;
-	gtk_window_set_title(GTK_WINDOW(ret.window), "Local User");
-	instance->box = ret.vbox;
-	GtkWidget *label = gtk_label_new("Click your face");
-	instance->label = label;
-	gtk_box_pack_start(GTK_BOX(ret.vbox), label, FALSE, FALSE, 0);
-	gtk_box_reorder_child(GTK_BOX(ret.vbox), label, 0);
-	gtk_widget_show(label);
-	GtkWidget *button = gtk_button_new_with_label("Confirm");
-	gtk_box_pack_start(GTK_BOX(ret.vbox), button, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_cb),
-			instance);
-	instance->button = button;
-	gtk_widget_show(button);
-
-	GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(ret.vbox), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-
-	GtkWidget *model_combo = gtk_combo_new();
-	GList *glist = NULL;
-
-	glist = g_list_append(glist, "Dog");
-	glist = g_list_append(glist, "Shark");
-	gtk_combo_set_popdown_strings(GTK_COMBO(model_combo), glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(model_combo),
-	//		10);
-	gtk_box_pack_start(GTK_BOX(hbox), model_combo, TRUE, TRUE, 0);
-	gtk_widget_show(model_combo);
-	instance->model = model_combo;
-
-	GtkWidget *head_material_combo = gtk_combo_new();
-	glist = NULL;
-	glist = g_list_append(glist, "Red");
-	glist = g_list_append(glist, "Dark Brown");
-	glist = g_list_append(glist, "Light Brown");
-	glist = g_list_append(glist, "White");
-	glist = g_list_append(glist, "Green");
-	glist = g_list_append(glist, "Black");
-	gtk_combo_set_popdown_strings(GTK_COMBO(head_material_combo), glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(head_material_combo),
-	//		10);
-	gtk_box_pack_start(GTK_BOX(hbox), head_material_combo, TRUE, TRUE, 0);
-	gtk_widget_show(head_material_combo);
-	instance->head = head_material_combo;
-
-	GtkWidget *appendage_material_combo = gtk_combo_new();
-	glist = NULL;
-	glist = g_list_append(glist, "Red");
-	glist = g_list_append(glist, "Dark Brown");
-	glist = g_list_append(glist, "Light Brown");
-	glist = g_list_append(glist, "White");
-	glist = g_list_append(glist, "Green");
-	glist = g_list_append(glist, "Black");
-	gtk_combo_set_popdown_strings(GTK_COMBO(appendage_material_combo),
-			glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(appendage_material_combo), 10);
-	gtk_box_pack_start(GTK_BOX(hbox), appendage_material_combo,
-			TRUE, TRUE, 0);
-	gtk_widget_show(appendage_material_combo);
-	instance->appendage = appendage_material_combo;
-
-	hbox = gtk_hbox_new(TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(ret.vbox), hbox, FALSE, FALSE, 0);
-	gtk_widget_show(hbox);
-	
-	GtkWidget *lids_material_combo = gtk_combo_new();
-	glist = NULL;
-	glist = g_list_append(glist, "Red");
-	glist = g_list_append(glist, "Dark Brown");
-	glist = g_list_append(glist, "Light Brown");
-	glist = g_list_append(glist, "White");
-	glist = g_list_append(glist, "Green");
-	glist = g_list_append(glist, "Black");
-	gtk_combo_set_popdown_strings(GTK_COMBO(lids_material_combo), glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(lids_material_combo), 10);
-	gtk_box_pack_start(GTK_BOX(hbox), lids_material_combo, TRUE, TRUE, 0);
-	gtk_widget_show(lids_material_combo);
-	instance->lid = lids_material_combo;
-
-	GtkWidget *left_iris_material_combo = gtk_combo_new();
-	glist = NULL;
-	glist = g_list_append(glist, "Red");
-	glist = g_list_append(glist, "Dark Brown");
-	glist = g_list_append(glist, "Light Brown");
-	glist = g_list_append(glist, "White");
-	glist = g_list_append(glist, "Green");
-	glist = g_list_append(glist, "Black");
-	gtk_combo_set_popdown_strings(GTK_COMBO(left_iris_material_combo),
-			glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(left_iris_material_combo), 10);
-	gtk_box_pack_start(GTK_BOX(hbox), left_iris_material_combo,
-			TRUE, TRUE, 0);
-	gtk_widget_show(left_iris_material_combo);
-	instance->left_iris = left_iris_material_combo;
-
-	/*
-	GtkWidget *right_iris_material_combo = gtk_combo_new();
-	glist = NULL;
-	glist = g_list_append(glist, "Red");
-	glist = g_list_append(glist, "Dark Brown");
-	glist = g_list_append(glist, "Light Brown");
-	glist = g_list_append(glist, "White");
-	glist = g_list_append(glist, "Green");
-	glist = g_list_append(glist, "Black");
-	gtk_combo_set_popdown_strings(GTK_COMBO(right_iris_material_combo),
-			glist);
-	g_list_free(glist);
-	//gtk_combo_box_set_column_span_column(GTK_COMBO(right_iris_material_combo), 10);
-	gtk_box_pack_start(GTK_BOX(hbox), right_iris_material_combo,
-			TRUE, TRUE, 0);
-	gtk_widget_show(right_iris_material_combo);
-	instance->right_iris = right_iris_material_combo;
-*/
-	gtk_widget_add_events(ret.draw_area, GDK_BUTTON_PRESS_MASK);
-	g_signal_connect(G_OBJECT(ret.draw_area), "button_press_event",
-			G_CALLBACK(click_cb), instance);
-	g_signal_connect(G_OBJECT(ret.window), "destroy",
-			G_CALLBACK(destroy_cb),	cc);
-//	gtk_widget_set_size_request(window, 640, 480);
-	gtk_window_set_default_size(GTK_WINDOW(ret.window),320,300);
-
-
-	GdkGeometry hints;
-        hints.max_width = 640;
-        hints.max_height = 480;
-
-        gtk_window_set_geometry_hints (GTK_WINDOW(ret.window),
-                                       NULL,
-                                      &hints,
-                                       GDK_HINT_MAX_SIZE);
-	gtk_widget_show(ret.window);
-	return instance;
-}
-
-static gboolean webcam_cb(struct input_instance *instance)
-{
-	assert(instance);
-	QueryCam();
-	return TRUE;
-}
-
-static void *facefind(void *data)
-{
-	fprintf(stderr, "waiting\n");
-	getchar();
-	fprintf(stderr,"got you");
-	detection_mode=1;
-	return;
-}
-
-void destroy_input(struct input_instance *instance)
-{
-	extern filter_bank *bank;
-	assert(instance);
-	Filter_Destroy(bank);
-	g_source_remove(instance->timer_id);
-	Die();
-	ExitMovies();
-}
-
-static gboolean config_wrapper(GtkWidget *widget, GdkEventConfigure *event,
-		void *data)
-{
-
-
-	GdkGLContext *glcontext = gtk_widget_get_gl_context(widget);
-	GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
-
-	GLfloat w = widget->allocation.width;
-	GLfloat h = widget->allocation.height;
-	GLfloat aspect;
-
-//	fprintf(stderr,"Homicide  %f   %f  %d\n", w,h,draw_mode);
-
-	if (draw_mode==1){
-//		fprintf(stderr, "Bad place to be- actually not so bad\n");
-		return configure(widget, event, data);
-	}
-
-	/*** OpenGL BEGIN ***/
-	if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
-		return FALSE;
-	
-
-/* Undo all of the Model lighting here*/
-
-//	glDisable(GL_LIGHTING);
-	glDisable(GL_DEPTH_TEST);
-//	glDisable(GL_CULL_FACE);
-//	glDisable(GL_LIGHT0);
-//	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
-/* */
-
-
-	glViewport(0,-(h/14),w*2,h*2);
-
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	gluOrtho2D(0,0,640,640);
-	glRasterPos2i(0,0);
-	glPixelZoom(-w/(1*640),(-h/(1*480)));
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-
-
-	
-	
-	gdk_gl_drawable_gl_end(gldrawable);
-	/*** OpenGL END ***/
-
-	return TRUE;
-}
-
-static gboolean mydraw(GtkWidget *widget, GdkEventExpose *event,
-			      void *data)
-{
-	GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
-	GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
-	struct input_instance *instance = (struct input_instance*)data;
-	unsigned int *boo;
-	struct cc_features *features = &instance->face;
-
-	char *string = gtk_entry_get_text(GTK_COMBO(instance->model)->entry);
-	if (!strcmp(string, "Dog")) {
-		features->kind = 0;
-	} else if (!strcmp(string, "Shark")) {
-		features->kind = 1;
-	}
-	
-	material_set(GTK_ENTRY(GTK_COMBO(instance->head)->entry),
-			&features->head_color);
-	material_set(GTK_ENTRY(GTK_COMBO(instance->appendage)->entry),
-			&features->appendage_color);
-	material_set(GTK_ENTRY(GTK_COMBO(instance->lid)->entry),
-			&features->lid_color);
-	material_set(GTK_ENTRY(GTK_COMBO(instance->left_iris)->entry),
-			&features->left_iris_color);
-	material_set(GTK_ENTRY(GTK_COMBO(instance->left_iris)->entry),
-			&features->right_iris_color);
-
-	if (easter_count>0) {
-		easter_count--;
-	} else {
-		instance->face.mode = 0;
-	}
-	
-	if (mode_change>0){
-		mode_change--;
-		config_wrapper(widget, event, data);
-	}
-
-	if (draw_mode==1){
-		instance->output.my_output=LOCAL;
-		return draw(widget,event,&instance->output);
-	}
-
-
-	boo = (unsigned int*)colorBuf;
-
-	assert(instance);
-	assert(gtk_widget_is_gl_capable(widget));
-
-	/*** OpenGL BEGIN ***/
-
-	if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) {
-	//	fprintf(stderr, "We're fucked this time.\n");
-		return FALSE;
-	}
-	
-	glClearColor(0.0, 0.0, 0.0, 0.0);
-	glClear(GL_COLOR_BUFFER_BIT);
-
-	glDrawPixels(WEBCAM_X, WEBCAM_Y-70, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, boo);
-
-	if (gdk_gl_drawable_is_double_buffered(gldrawable))
-		gdk_gl_drawable_swap_buffers(gldrawable);
-	else
-		glFlush();
-	
-	gdk_gl_drawable_gl_end(gldrawable);
-	
-	/*** OpenGL END ***/
-	
-	return TRUE;
-}
-
-static void init_cb(GtkWidget *widget, struct input_instance *instance)
-{
-  //	setupDrawlists(LOCAL);
-//	fprintf(stderr,"init_cb\n");
-}
-
-static gboolean click_cb(GtkWidget *widget, GdkEventButton *event,
-		struct input_instance *instance)
-{
-
-	GLfloat w = widget->allocation.width;
-	GLfloat h = widget->allocation.height;
-	GLfloat aspect;
-
-	if (draw_mode==1) {
-		switch (event->button) {
-			case 1:
-				Debug("F U!\n");
-				instance->face.mode = 1;
-				easter_count = 5;
-				break;
-			case 3:
-				Debug("should never get here\n");
-				instance->face.mode = 2;
-				easter_count = 5;
-				break;
-			default:
-				instance->face.mode = 0;
-				break;
-		}
-		return FALSE;
-	}
-
-	x_click=(event->x*(640/w));
-	x_click=640-x_click;
-	y_click=(event->y-(h/14))*(480/(h-(h/14)));
-	detection_mode=1;
-	//Debug("@@@ x:%d y:%d\n", x_click, y_click);
-
-	gtk_label_set_text(instance->label,
-			"Put on the box, then press confirm.");
-	if (x_click <= 10) x_click=10;
-	if (x_click >= WEBCAM_X-10) x_click=WEBCAM_X-60;
-	if (y_click <= 10) y_click=10;
-	if (y_click >= WEBCAM_Y-10) y_click=WEBCAM_Y-60;
-
-	return FALSE;
-}
-
-static void button_cb(GtkWidget *button, struct input_instance *instance)
-{
-	if (!draw_mode) { /* transition to face mode */
-		if (detection_mode == 0) { /* ignore confirm if no calibrate */
-			return;
-		}
-		setupLighting(instance->widget);
-		mode_change = 1;
-		gtk_button_set_label(GTK_BUTTON(button), "Calibrate");
-		gtk_label_set_label(instance->label,
-				"If things get too crazy, click Calibrate.");
-	} else { /* transition to calibration mode */
-		gtk_label_set_label(instance->label, "Click your face");
-		mode_change = 2;
-		gtk_button_set_label(GTK_BUTTON(button), "Confirm");
-	}
-	draw_mode = !draw_mode;
-}
-
-static void destroy_cb(GtkWidget *widget, struct crazychat *cc)
-{
-	cc->features_state = 0;
-	destroy_input(cc->input_data);
-	cc->input_data = NULL;
-}
-
-static void material_set(GtkWidget *entry, guint8 *material)
-{
-	char *string = gtk_entry_get_text(GTK_ENTRY(entry));
-	if (!strcmp(string, "Red")) {
-		*material = 0;
-	} else if (!strcmp(string, "Dark Brown")) {
-		*material = 1;
-	} else if (!strcmp(string, "Light Brown")) {
-		*material = 2;
-	} else if (!strcmp(string, "White")) {
-		*material = 3;
-	} else if (!strcmp(string, "Green")) {
-		*material = 4;
-	} else if (!strcmp(string, "Black")) {
-		*material = 5;
-	}
-}

mercurial