view plugins/crazychat/sharky.c @ 12115:e9790eb93216

[gaim-migrate @ 14415] quoth charkins: " This patch has a few small fixes for the visibility stuff in gtkblist.c. First, tracking of the ICONIFIED state of the blist was removed. This was intended to allow the blist to "remember" if it was minimized between restarts. Unfortunately, this is not possible because the ICONIFIED state gets set when the blist is on a different desktop with many window managers. Second, while talking about the ICONIFIED issue on #gtk@GIMPNet, muntyan_ asked about a bug where the blist would get shown on an account re-connect with 1.5.0. Luke mentioned something about this with cvs as well. This patch introduces a check in gaim_gtk_blist_show() to prevent the window from being shown if it already exists and is visible. Third, sadrul pointed me to a one-line fix for the missing blist on startup. I added a second line to make sure the blist restores its proper size as well. Finally, when the last visibility manager is removed, gaim will now minimize the blist if it was previously hidden, rather than showing it. This could prevent a race condition with out-of-process applets, preventing gaim from maintaining the visibility state properly between restarts. This was 'cvs diff'ed against the last available anon cvs from Friday. Hopefully it'll apply cleanly." it did. committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Wed, 16 Nov 2005 17:55:26 +0000
parents ed017b9c532d
children
line wrap: on
line source

#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;
}