diff pidgin/plugins/crazychat/sharky.c @ 15374:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children a8cc50c2279f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/crazychat/sharky.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,249 @@
+#include "face.h"
+#include "sharky.h"
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "models.h"
+
+#define NUM_SHARKS 12
+#define NUM_SHARK_LIDS 10
+#define NUM_FINS 4
+#define NUM_SHARK_EYES 1
+#define NUM_SHARK_PUPILS 1
+#define NUM_SHARK_IRIS 1
+#define SHARK_SCALE .025
+#define SHARK_EYES_Y 7.5*SHARK_SCALE // .295
+#define SHARK_EYES_X 28.89*SHARK_SCALE // .26
+#define SHARK_EYES_Z 56*SHARK_SCALE // .38
+#define SHARK_FINS_X 75*SHARK_SCALE //.65
+#define SHARK_FINS_Y -44*SHARK_SCALE//.18
+#define SHARK_FINS_Z -15*SHARK_SCALE //.05
+#define SHARK_IRIS_X 0*SHARK_SCALE
+#define SHARK_IRIS_Y 1.67*SHARK_SCALE//.015
+#define SHARK_IRIS_Z 5.0*SHARK_SCALE//.08
+#define SHARK_PUP_X 0*SHARK_SCALE
+#define SHARK_PUP_Y 0*SHARK_SCALE 
+#define SHARK_PUP_Z 2.5*SHARK_SCALE //.028
+#define SHARK_IRIS_SCALE .10*SHARK_SCALE
+#define SHARK_PUP_SCALE .08*SHARK_SCALE
+#define SHARK_FIN_SCALE .9*SHARK_SCALE
+#define SHARK_EYE_SCALE .7*SHARK_SCALE
+#define SHARK_LID_SCALE .84*SHARK_SCALE
+#define SHARK_HEAD_SCALE .58*SHARK_SCALE
+#define TOP_FIN_X 0*SHARK_SCALE
+#define TOP_FIN_Y 4*SHARK_SCALE
+#define TOP_FIN_Z 25*SHARK_SCALE
+#define BOT_FIN_X 0*SHARK_SCALE
+#define BOT_FIN_Y 9*SHARK_SCALE
+#define BOT_FIN_Z -70*SHARK_SCALE
+#define TOP_FIN_SCALE 2*SHARK_SCALE
+#define MAX_FIN_ANGLE 90.0
+#define MIN_FIN_ANGLE -20.0
+#define ANGLE_INC 60
+float fins=0;
+
+
+char shark_mtl_file[MAX_FILE_LEN] = "dog.mtl";
+// the initial dog materials
+GLint init_shark_mats[NUM_PARTS] = {1, 2, 3, 4, 5, 3, 5, 0, 0, 0};
+
+void draw_shark_pupil(FACE f, PART p) {
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+	glPushMatrix();
+	glTranslatef(SHARK_IRIS_X, -SHARK_IRIS_Z, SHARK_IRIS_Y);
+	if(p==LEFT_IRIS)
+		glmSetMat(f->materials, f->mat_indeces[LEFT_IRIS]);
+	else
+		glmSetMat(f->materials, f->mat_indeces[RIGHT_IRIS]);
+	glCallList(shark->iris[0]);
+	glTranslatef(SHARK_PUP_X, -SHARK_PUP_Z, SHARK_PUP_Y);
+	glmSetMat(f->materials, f->mat_indeces[PUPIL]);
+	glCallList(shark->pupil[0]);
+	glPopMatrix();
+}
+
+void draw_shark_left_eye(FACE f, BOOL open, int max) {
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+	if(f->my_mode==CRAZY2)
+		shark->curr_left_lid=NUM_SHARK_LIDS-1;
+	else
+		shark->curr_left_lid = compute_lid(open, shark->curr_left_lid, max);
+	glPushMatrix();
+	glTranslatef(-SHARK_EYES_X, 0.0, 0.0);
+	glPushMatrix();
+	glTranslatef(0.0, -f->curr_eye_pop, 0.0);
+	draw_shark_pupil(f, LEFT_IRIS);
+	glmSetMat(f->materials, f->mat_indeces[EYES]);
+	glCallList(shark->eyes[shark->curr_left_eye]);
+	glPopMatrix();
+	glmSetMat(f->materials, f->mat_indeces[LIDS]);
+	glCallList(shark->lids[shark->curr_left_lid]);
+	glPopMatrix();
+}
+
+void draw_shark_right_eye(FACE f, BOOL open, int max) {
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+	if(f->my_mode==CRAZY2)
+		shark->curr_right_lid=NUM_SHARK_LIDS-1;
+	else
+		shark->curr_right_lid = compute_lid(open, shark->curr_right_lid, max);
+	glPushMatrix();
+	glTranslatef(SHARK_EYES_X, 0.0, 0.0);
+	glPushMatrix();
+	glTranslatef(0.0, -f->curr_eye_pop, 0.0);
+	draw_shark_pupil(f, RIGHT_IRIS);
+	glmSetMat(f->materials, f->mat_indeces[EYES]);
+	glCallList(shark->eyes[shark->curr_right_eye]);
+	glPopMatrix();
+	glmSetMat(f->materials, f->mat_indeces[LIDS]);
+	glCallList(shark->lids[shark->curr_right_lid]);
+	glPopMatrix();
+}
+
+void shark_eyes(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, DIRECTION dir)
+{
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+	int max_eye;
+	if(dir==CONST) { //then not moving, eyes are gettin sleepy
+		f->eye_count--;
+	}
+	else{
+		f->eye_count=EYE_TIME*NUM_SHARK_LIDS-1;
+	}
+	max_eye=f->eye_count/EYE_TIME;
+	if(max_eye<0)
+		max_eye=0;
+	if(f->my_mode==CRAZY2)
+		f->curr_eye_pop=f->curr_eye_pop + (MAX_EYE_POP - f->curr_eye_pop)/2;
+	else
+		f->curr_eye_pop=f->curr_eye_pop - (f->curr_eye_pop-0)/2;
+	glPushMatrix();
+	glTranslatef(0, 0, SHARK_EYES_Y);
+	glTranslatef(0, -SHARK_EYES_Z,0);
+	draw_shark_left_eye(f, left_open, max_eye);
+	draw_shark_right_eye(f, right_open, max_eye);	
+	glPopMatrix();
+}
+
+void shark_fins(FACE f, DIRECTION dir){
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+
+	if(dir==DOWN){
+		if(shark->curr_fin < (NUM_FINS-1))
+			shark->curr_fin++;
+		shark->curr_fin_angle = shark->curr_fin_angle+(MAX_FIN_ANGLE-shark->curr_fin_angle)/2;
+	}
+	if(dir==UP){
+		if(shark->curr_fin > 0)
+			shark->curr_fin--;
+		shark->curr_fin_angle = shark->curr_fin_angle+(MIN_FIN_ANGLE-shark->curr_fin_angle)/2;
+	}
+	else if(dir==CONST){
+		shark->curr_fin=1;
+		shark->curr_fin_angle = shark->curr_fin_angle+(0-shark->curr_fin_angle)/3;
+	}
+
+	glPushMatrix();
+	glTranslatef(-SHARK_FINS_X, -SHARK_FINS_Z, SHARK_FINS_Y);
+	if(f->my_mode==CRAZY1)
+		glRotatef(MAX_FIN_ANGLE, 0.0, 1.0, 0.0);
+	else
+		glRotatef(shark->curr_fin_angle, 0.0, 1.0, 0.0);
+	glmSetMat(f->materials, f->mat_indeces[APPENDAGE]);
+	glCallList(shark->fins[shark->curr_fin]);
+	glPopMatrix();
+	glPushMatrix();
+	glTranslatef(SHARK_FINS_X, -SHARK_FINS_Z, SHARK_FINS_Y);
+	glScalef(-1, 1, 1);
+	if(f->my_mode==CRAZY1)
+		glRotatef(MIN_FIN_ANGLE, 0.0, 1.0, 0.0);
+	else
+		glRotatef(shark->curr_fin_angle, 0.0, 1.0, 0.0);
+	glCallList(shark->fins[shark->curr_fin]);
+	glPopMatrix();
+}
+
+void draw_back_fins(FACE f){
+	struct shark_struct* shark=(struct shark_struct*)f->char_struct;
+	glPushMatrix();
+	glTranslatef(0, fins, TOP_FIN_Y);
+	glRotatef(180, 0.0, 1.0, 0.0);
+	glScalef(.5*TOP_FIN_SCALE,TOP_FIN_SCALE,TOP_FIN_SCALE);
+	glmSetMat(f->materials, f->mat_indeces[APPENDAGE]);
+	glCallList(shark->fins[2]);
+	glPopMatrix();
+	
+}
+
+void draw_shark(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, GLfloat open, DIRECTION dir, OUTPUT_MODE mode){
+	int next_face; 
+	struct shark_struct* shark;	
+
+	f->crazy_count--;
+	if(f->crazy_count==0){
+		f->my_mode = mode;
+		if(mode!=NORMAL)
+			f->crazy_count = CRAZY_COUNT;
+		else
+			f->crazy_count = 1;
+	}
+	apply_output_mode(f, &angle, &yangle, &left_open, &right_open, &open, &dir);
+	next_face = NUM_SHARKS - open*NUM_SHARKS - 1;
+	shark  = (struct shark_struct*)f->char_struct;
+	if(next_face > shark->curr_face)
+		shark->curr_face++;
+	else if(next_face < shark->curr_face)
+		shark->curr_face--;
+
+	glPushMatrix();
+	glRotatef(-90, 1.0, 0.0, 0.0);
+	glRotatef(-yangle, 0.0, 0.0, -1.0);
+	glRotatef(-angle, 0, 1, 0);
+	shark_eyes(f, angle, yangle, left_open, right_open, dir);	
+	shark_fins(f, dir);
+	//draw_back_fins(f);
+	glmSetMat(f->materials, f->mat_indeces[HEAD]);
+	glCallList(shark->faces[shark->curr_face]);
+	glPopMatrix();
+}
+
+
+void init_shark(FACE f){
+	int i;
+	struct shark_struct* shark;
+	f->char_struct = (struct shark_struct*)malloc(sizeof(struct shark_struct));
+	f->materials = glmMTL(shark_mtl_file);
+	f->mat_indeces=(GLint*)malloc(sizeof(GLint)*NUM_PARTS);
+	//initialize all of the parts to some colors
+	change_materials(f, init_shark_mats, NUM_PARTS);
+	f->my_mode = NORMAL;
+	f->eye_count = EYE_TIME*NUM_SHARK_LIDS-1;
+	f->crazy_count = 1;
+	f->curr_z_angle = 0;
+	f->curr_eye_pop = 0;
+	f->name = strdup("sharky");
+	f->draw_func = draw_shark;
+	shark = (struct shark_struct*)f->char_struct;
+	
+	printf("\nReading models: ");
+	fflush(0);
+	
+	//initialize the draw lists
+	init_lists(&shark->faces, &shark->m_faces, NUM_SHARKS, f->name, SHARK_HEAD_SCALE);
+	init_lists(&shark->lids, &shark->m_lids, NUM_SHARK_LIDS, "sharkylid", SHARK_LID_SCALE);
+	init_lists(&shark->fins, &shark->m_fins, NUM_FINS, "sharkyfin", SHARK_FIN_SCALE);
+	init_lists(&shark->eyes, &shark->m_eyes, NUM_SHARK_EYES, "sharkyeye", SHARK_EYE_SCALE);
+	init_lists(&shark->pupil, &shark->m_pupil, NUM_SHARK_PUPILS, "sharkypupil", SHARK_PUP_SCALE);
+	init_lists(&shark->iris, &shark->m_iris, NUM_SHARK_IRIS, "sharkyiris", SHARK_IRIS_SCALE);
+
+	printf("\n");
+	fflush(0);
+		
+	shark->curr_face = 0;
+	shark->curr_fin = 1;
+	shark->curr_left_lid = 0;
+	shark->curr_right_lid = 0;
+	shark->curr_left_eye = 0;
+	shark->curr_right_eye = 0;
+	shark->curr_pupil = 0;
+	shark->curr_fin_angle = 0;
+}