Mercurial > pidgin.yaz
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 } |