// init_scene initializes the global variable g_projectiles immediately after // a shot has been fired. void init_scene() { struct Tank *t = &g_tanks[g_current_tank]; Vector dir = { sin(D2R(t->s.turret_angle))*cos(D2R(t->s.weapon_angle)), sin(D2R(t->s.weapon_angle)), cos(D2R(t->s.turret_angle))*cos(D2R(t->s.weapon_angle)), }; Vector pos; // FIX ME!! Is this the right way to handle tank angle? // vv_add(dir, t->o.props.angular_position); v_norm(dir); // FIX ME!! We do not fire from the end of the barrel vv_cpy(pos, t->o.props.position); vv_add(pos, t->m.turret_base); vv_add(pos, t->m.weapon_base); printf("New projectile\n"); printf("Position: %f %f %f\n", pos[0], pos[1], pos[2]); printf("Direction: %f %f %f\n", dir[0], dir[1], dir[2]); printf("Tank pos: %f %f %f\n", t->o.props.position[0], t->o.props.position[1], t->o.props.position[2]); new_projectile( dir, // Direction t->s.power, // Magnitude pos, // Position Missile_I // Type ); }
void Shape3D :: set_face(int f_pos, int pos, int pos2, int pos3, int vert_faces[]) { // allocate new face faces[f_pos] = new int[3]; faces[f_pos][0] = pos; faces[f_pos][1] = pos2; faces[f_pos][2] = pos3; // calculate face normal calc_face_normal(f_pos); // add to vertex normals // update vertex face counts vv_add(v_norms[pos],f_norms[f_pos], v_norms[pos]); vert_faces[pos]++; vv_add(v_norms[pos2], f_norms[f_pos], v_norms[pos2]); vert_faces[pos2]++; vv_add(v_norms[pos3], f_norms[f_pos], v_norms[pos3]); vert_faces[pos3]++; }
void Mesh :: parse_face(char buffer[], int i, int* vert_faces) { char* token; int pos, pos2, pos3; float red, green, blue, speed; token = strtok(buffer, " "); faces[i] = new int[3]; pos = atoi(token); faces[i][0] = pos; token = strtok(NULL, " "); pos2 = atoi(token); faces[i][1] = pos2; token = strtok(NULL, " "); pos3 = atoi(token); faces[i][2] = pos3; face_colors[i] = new float[4]; token = strtok(NULL, " "); face_colors[i][0] = atof(token); token = strtok(NULL, " "); face_colors[i][1] = atof(token); token = strtok(NULL, " "); face_colors[i][2] = atof(token); token = strtok(NULL, " "); face_colors[i][3] = atof(token); if(face_colors[i][3] > 0) { token = strtok(NULL, " "); red = atof(token); token = strtok(NULL, " "); green = atof(token); token = strtok(NULL, " "); blue = atof(token); token = strtok(NULL, " "); speed = atof(token); set_flashing(i, red, green, blue, speed); } // calculate face normal calc_face_normal(i); // add to vertex normals // update vertex face counts vv_add(v_norms[pos],f_norms[i], v_norms[pos]); vert_faces[pos]++; vv_add(v_norms[pos2], f_norms[i], v_norms[pos2]); vert_faces[pos2]++; vv_add(v_norms[pos3], f_norms[i], v_norms[pos3]); vert_faces[pos3]++; }
void move_particle(particle_type* p, GLfloat delta) { Vector accel, tempa, tempv; GLfloat deltasq = delta*delta; accel[0] = 0.0; accel[1] = -ps->gravity; accel[2] = 0.0; accel[3] = 0.0; vv_cpy(tempa, accel); vc_mul(tempa, 0.5); vc_mul(tempa, deltasq); vv_cpy(tempv, p->velocity); vc_mul(tempv, (double)delta); vv_add(tempa, tempv); vv_cpy(p->prevpos[p->begin], p->position); p->begin = (p->begin + 1) % PREVIOUS; vv_add(p->position, tempa); vv_cpy(tempa, accel); vc_mul(tempa, delta); vv_add(p->velocity, tempa); }