Beispiel #1
0
// 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
    );
}
Beispiel #2
0
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]++;
	 
}
Beispiel #3
0
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]++;
}
Beispiel #4
0
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);
}