comparison plugins/crazychat/doggy.c @ 11218:ed017b9c532d

[gaim-migrate @ 13350] crazychat commit, first one. committer: Tailor Script <tailor@pidgin.im>
author Charlie Stockman <chuckleberry>
date Tue, 09 Aug 2005 07:10:23 +0000
parents
children
comparison
equal deleted inserted replaced
11217:f854402837ba 11218:ed017b9c532d
1 #include "face.h"
2 #include "doggy.h"
3 #include <GL/gl.h>
4 #include <GL/glu.h>
5 #include "models.h"
6
7 #define NUM_DOGS 11
8 #define NUM_DOG_LIDS 10
9 #define NUM_EARS 3
10 #define NUM_EYES 1
11 #define NUM_PUPILS 1
12 #define NUM_IRIS 1
13 #define SCALE .020
14 #define EYES_Y 32.78*SCALE // .295
15 #define EYES_X 28.89*SCALE // .26
16 #define EYES_Z 42.22*SCALE // .38
17 #define EARS_X 60*SCALE //.65
18 #define EARS_Y 20*SCALE//.18
19 #define EARS_Z -5.56*SCALE //.05
20 #define IRIS_X 0*SCALE
21 #define IRIS_Y 1.67*SCALE//.015
22 #define IRIS_Z 7*SCALE//.08
23 #define PUP_X 0*SCALE
24 #define PUP_Y 0*SCALE
25 #define PUP_Z 1.2*SCALE //.028
26 #define IRIS_SCALE .12*SCALE
27 #define PUP_SCALE .11*SCALE
28 #define EAR_SCALE .7*SCALE
29 #define EYE_SCALE .7*SCALE
30 #define LID_SCALE .77*SCALE
31 #define DOG_SCALE .58*SCALE
32 #define MAX_FILE_LEN 64
33 #define MAX_EAR_ANGLE 90.0
34 #define MIN_EAR_ANGLE -20.0
35
36
37 char dog_mtl_file[MAX_FILE_LEN] = "dog.mtl";
38 // the initial dog materials
39 GLint init_dog_mats[NUM_PARTS] = {1, 2, 2, 4, 0, 3, 5, 0, 0, 0};
40
41 void draw_pupil(FACE f, PART p) {
42 struct doggy_struct* dog=(struct doggy_struct*)f->char_struct;
43 glPushMatrix();
44 glTranslatef(IRIS_X, -IRIS_Z, IRIS_Y);
45 if(p==LEFT_IRIS)
46 glmSetMat(f->materials, f->mat_indeces[LEFT_IRIS]);
47 else
48 glmSetMat(f->materials, f->mat_indeces[RIGHT_IRIS]);
49 glCallList(dog->iris[0]);
50 glTranslatef(PUP_X, -PUP_Z, PUP_Y);
51 glmSetMat(f->materials, f->mat_indeces[PUPIL]);
52 glCallList(dog->pupil[0]);
53 glPopMatrix();
54 }
55
56 void draw_left_eye(FACE f, BOOL open, int max) {
57 struct doggy_struct* dog=(struct doggy_struct*)f->char_struct;
58 if(f->my_mode==CRAZY2)
59 dog->curr_left_lid=NUM_DOG_LIDS-1;
60 else
61 dog->curr_left_lid = compute_lid(open, dog->curr_left_lid, max);
62 glPushMatrix();
63 glTranslatef(-EYES_X, 0.0, 0.0);
64 glPushMatrix();
65 glTranslatef(0.0, -f->curr_eye_pop, 0.0);
66 draw_pupil(f, LEFT_IRIS);
67 glmSetMat(f->materials, f->mat_indeces[EYES]);
68 glCallList(dog->eyes[dog->curr_left_eye]);
69 glPopMatrix();
70 glmSetMat(f->materials, f->mat_indeces[LIDS]);
71 glCallList(dog->lids[dog->curr_left_lid]);
72 glPopMatrix();
73 }
74
75 void draw_right_eye(FACE f, BOOL open, int max) {
76 struct doggy_struct* dog=(struct doggy_struct*)f->char_struct;
77 if(f->my_mode==CRAZY2)
78 dog->curr_right_lid=NUM_DOG_LIDS-1;
79 else
80 dog->curr_right_lid = compute_lid(open, dog->curr_right_lid, max);
81 glPushMatrix();
82 glTranslatef(EYES_X, 0.0, 0.0);
83 glScalef(-1, 1, 1);
84 glPushMatrix();
85 glTranslatef(0.0, -f->curr_eye_pop, 0.0);
86 draw_pupil(f, RIGHT_IRIS);
87 glmSetMat(f->materials, f->mat_indeces[EYES]);
88 glCallList(dog->eyes[dog->curr_right_eye]);
89 glPopMatrix();
90 glmSetMat(f->materials, f->mat_indeces[LIDS]);
91 glCallList(dog->lids[dog->curr_right_lid]);
92 glPopMatrix();
93 }
94
95 void dog_eyes(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, DIRECTION dir)
96 {
97 struct doggy_struct* dog=(struct doggy_struct*)f->char_struct;
98 int max_eye;
99 if(dir==CONST) { //then not moving, eyes are gettin sleepy
100 f->eye_count--;
101 }
102 else{
103 f->eye_count=EYE_TIME*NUM_DOG_LIDS-1;
104 }
105 max_eye=f->eye_count/EYE_TIME;
106 if(max_eye<0)
107 max_eye=0;
108 if(f->my_mode==CRAZY2)
109 f->curr_eye_pop=f->curr_eye_pop + (MAX_EYE_POP - f->curr_eye_pop)/2;
110 else
111 f->curr_eye_pop=f->curr_eye_pop - (f->curr_eye_pop-0)/2;
112 glPushMatrix();
113 glTranslatef(0, 0, EYES_Y);
114 glTranslatef(0, -EYES_Z,0);
115 draw_left_eye(f, left_open, max_eye);
116 draw_right_eye(f, right_open, max_eye);
117 glPopMatrix();
118 }
119
120 void dog_ears(FACE f, DIRECTION dir){
121 struct doggy_struct* dog=(struct doggy_struct*)f->char_struct;
122 //printf("ears %f\n", ears);
123 if(dir==DOWN){
124 if(dog->curr_ear < (NUM_EARS-1))
125 dog->curr_ear++;
126 dog->curr_ear_angle = dog->curr_ear_angle+(MAX_EAR_ANGLE-dog->curr_ear_angle)/2;
127 }
128 if(dir==UP){
129 if(dog->curr_ear > 0)
130 dog->curr_ear--;
131 dog->curr_ear_angle = dog->curr_ear_angle+(MIN_EAR_ANGLE-dog->curr_ear_angle)/2;
132 }
133 else if(dir==CONST){
134 dog->curr_ear=1;
135 dog->curr_ear_angle = dog->curr_ear_angle+(0-dog->curr_ear_angle)/3;
136 }
137
138 glPushMatrix();
139 glTranslatef(-EARS_X, -EARS_Z, EARS_Y);
140 if(f->my_mode==CRAZY1)
141 glRotatef(MAX_EAR_ANGLE, 0.0, 1.0, 0.0);
142 else
143 glRotatef(dog->curr_ear_angle, 0.0, 1.0, 0.0);
144 glmSetMat(f->materials, f->mat_indeces[APPENDAGE]);
145 glCallList(dog->ears[dog->curr_ear]);
146 glPopMatrix();
147 glPushMatrix();
148 glTranslatef(EARS_X, -EARS_Z, EARS_Y);
149 glScalef(-1, 1, 1);
150 if(f->my_mode==CRAZY1)
151 glRotatef(MIN_EAR_ANGLE, 0.0, 1.0, 0.0);
152 else
153 glRotatef(dog->curr_ear_angle, 0.0, 1.0, 0.0);
154 glCallList(dog->ears[dog->curr_ear]);
155 glPopMatrix();
156 }
157
158 void draw_dog(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, GLfloat open, DIRECTION dir, OUTPUT_MODE mode){
159 int next_face;
160 struct doggy_struct* dog;
161 f->crazy_count--;
162 if(f->crazy_count==0){
163 f->my_mode = mode;
164 if(mode!=NORMAL)
165 f->crazy_count = CRAZY_COUNT;
166 else
167 f->crazy_count = 1;
168 }
169 apply_output_mode(f, &angle, &yangle, &left_open, &right_open, &open, &dir);
170 next_face = NUM_DOGS - open*NUM_DOGS - 1;
171 dog = (struct doggy_struct*)f->char_struct;
172 if(next_face > dog->curr_face)
173 dog->curr_face++;
174 else if(next_face < dog->curr_face)
175 dog->curr_face--;
176
177 glPushMatrix();
178 glRotatef(-90, 1.0, 0.0, 0.0);
179 glRotatef(-yangle, 0.0, 0.0, -1.0);
180 glRotatef(-angle, 0, 1, 0);
181 dog_eyes(f, angle, yangle, left_open, right_open, dir);
182 dog_ears(f, dir);
183 glmSetMat(f->materials, f->mat_indeces[HEAD]);
184 glCallList(dog->faces[dog->curr_face]);
185 glPopMatrix();
186 }
187
188 void init_dog(FACE f){
189 int i;
190 struct doggy_struct* dog;
191 f->char_struct = (struct doggy_struct*)malloc(sizeof(struct doggy_struct));
192 f->materials = glmMTL(dog_mtl_file);
193 f->mat_indeces=(GLint*)malloc(sizeof(GLint)*NUM_PARTS);
194 //initialize all of the parts to some colors
195 change_materials(f, init_dog_mats, NUM_PARTS);
196 f->my_mode = NORMAL;
197 f->eye_count = EYE_TIME*NUM_DOG_LIDS-1;
198 f->crazy_count = 1;
199 f->curr_z_angle = 0;
200 f->curr_eye_pop = 0;
201 f->name = strdup("dog");
202 f->draw_func = draw_dog;
203 dog = (struct doggy_struct*)f->char_struct;
204
205 printf("\nReading models: ");
206 fflush(0);
207
208 //initialize the draw lists
209 init_lists(&dog->faces, &dog->m_faces, NUM_DOGS, f->name, DOG_SCALE);
210 init_lists(&dog->lids, &dog->m_lids, NUM_DOG_LIDS, "lid", LID_SCALE);
211 init_lists(&dog->ears, &dog->m_ears, NUM_EARS, "ear", EAR_SCALE);
212 init_lists(&dog->eyes, &dog->m_eyes, NUM_EYES, "dogeye", EYE_SCALE);
213 init_lists(&dog->pupil, &dog->m_pupil, NUM_PUPILS, "dogpupil", PUP_SCALE);
214 init_lists(&dog->iris, &dog->m_iris, NUM_IRIS, "dogiris", IRIS_SCALE);
215
216 printf("\n");
217 fflush(0);
218
219 dog->curr_face = 0;
220 dog->curr_ear = 1;
221 dog->curr_left_lid = 9;
222 dog->curr_right_lid = 0;
223 dog->curr_left_eye = 0;
224 dog->curr_right_eye = 0;
225 dog->curr_pupil = 0;
226 dog->curr_ear_angle = 0;
227 }