コード例 #1
0
ファイル: mesh.c プロジェクト: Stanton-e/space-nerds-in-space
struct mesh *init_line_mesh(double x1, double y1, double z1, double x2, double y2, double z2)
{
	struct mesh *my_mesh = malloc(sizeof(*my_mesh));

	if (!my_mesh)
		return my_mesh;
	memset(my_mesh, 0, sizeof(*my_mesh));

	my_mesh->geometry_mode = MESH_GEOMETRY_LINES;
	my_mesh->nvertices = 2;
	my_mesh->ntriangles = 0;
	my_mesh->nlines = 1;
	my_mesh->t = 0;
	my_mesh->v = malloc(sizeof(*my_mesh->v) * 2);
	my_mesh->l = malloc(sizeof(*my_mesh->l) * 1);
	my_mesh->tex = 0;
	my_mesh->radius = fmax(dist3d(x1, y1, z1), dist3d(x2, y2, z2));
	my_mesh->graph_ptr = 0;

	my_mesh->v[0].x = x1;
	my_mesh->v[0].y = y1;
	my_mesh->v[0].z = -z1;
	my_mesh->v[1].x = x2;
	my_mesh->v[1].y = y2;
	my_mesh->v[1].z = -z2;

	my_mesh->l[0].start = &my_mesh->v[0];
	my_mesh->l[0].end = &my_mesh->v[1];
	my_mesh->l[0].flag = 0;

	mesh_graph_dev_init(my_mesh);
	return my_mesh;
}
コード例 #2
0
ファイル: topfisheyeview.c プロジェクト: joewalnes/graphviz2
void fisheye_spherical(double x_focus, double y_focus, double z_focus,
		       topview * t)
{
    int i;
    double distance, distorted_distance, ratio, range;

    range = 0;
    for (i = 1; i < t->Nodecount; i++) {
	if (point_within_sphere_with_coords
	    ((float) x_focus, (float) y_focus, (float) z_focus,
	     (float) view->fmg.R, t->Nodes[i].x, t->Nodes[i].y,
	     t->Nodes[i].z)) {


	    range =
		MAX(range,
		    dist3d(t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z,
			   x_focus, y_focus, z_focus));
	}
    }

    for (i = 1; i < t->Nodecount; i++) {


	if (point_within_sphere_with_coords
	    ((float) x_focus, (float) y_focus, (float) z_focus,
	     (float) view->fmg.R, t->Nodes[i].x, t->Nodes[i].y,
	     t->Nodes[i].z)) {
	    distance =
		dist3d(t->Nodes[i].x, t->Nodes[i].y, t->Nodes[i].z,
		       x_focus, y_focus, z_focus);
	    distorted_distance = G(distance / range) * range;
	    if (distance != 0) {
		ratio = distorted_distance / distance;
	    } else {
		ratio = 0;
	    }
	    t->Nodes[i].distorted_x =
		(float) x_focus + (t->Nodes[i].x -
				   (float) x_focus) * (float) ratio;
	    t->Nodes[i].distorted_y =
		(float) y_focus + (t->Nodes[i].y -
				   (float) y_focus) * (float) ratio;
	    t->Nodes[i].distorted_z =
		(float) z_focus + (t->Nodes[i].z -
				   (float) z_focus) * (float) ratio;
	    t->Nodes[i].zoom_factor =
		(float) 1 *(float) distorted_distance / (float) distance;
	} else {
	    t->Nodes[i].distorted_x = t->Nodes[i].x;
	    t->Nodes[i].distorted_y = t->Nodes[i].y;
	    t->Nodes[i].distorted_z = t->Nodes[i].z;
	    t->Nodes[i].zoom_factor = 1;
	}
    }
}
コード例 #3
0
/* safe to call with v == output */
void normalize_vector(struct mat41 *v, struct mat41 *output)
{
    float d;

    d = dist3d(v->m[0], v->m[1], v->m[2]);
    output->m[0] = v->m[0] / d;
    output->m[1] = v->m[1] / d;
    output->m[2] = v->m[2] / d;
}
コード例 #4
0
ファイル: mesh.c プロジェクト: Stanton-e/space-nerds-in-space
float mesh_compute_radius(struct mesh *m)
{
	int i;
	float r, max_radius = 0.0;

	for (i = 0; i < m->nvertices; i++) {
		r = dist3d(m->v[i].x, m->v[i].y, m->v[i].z);
		if (r > max_radius)
			max_radius = r;
	}
	return max_radius;
}
コード例 #5
0
void restore_and_move (mc_connection *mc, int t, int x, int y, int z)
{
	int xp = mc->mc_server_data.mc_player_db[256].x;
	int yp = mc->mc_server_data.mc_player_db[256].y;
	int zp = mc->mc_server_data.mc_player_db[256].z;
	
	if (dist3d(x, y, z, xp, yp, zp) < 6) {
		restore_block(mc, t, x, y, z);
	} else {
		mc_proto_send_pos(mc, x, y, z, 130, 130);
		mc_proto_send_pos(mc, x, y, z, 130, 130);
		restore_block(mc, t, x, y, z);
	}
}  
コード例 #6
0
ファイル: pointDist.c プロジェクト: cthree-40/surfgen
void computedist( int *dist, int nrgeoms, struct geometry *rgeoms,
		  struct point *ptdata )
{
  struct point           *currptd;
  struct geometry        *currrgm;
  int                   indexp, i;
  
  /* set pointers */
  currrgm = rgeoms;
  currptd = ptdata;
  indexp = 1;
  /* loop over rgeoms */
  while ( currrgm-> next != 0 ) {
    /* set index */
    currptd->index = indexp;
    /* compute each two atom distance */
    for ( i = 0; i < 5; i++ ) {
      currptd->coord[i] = dist3d( &(currrgm->atom[dist[(i * 2)]-1]),
				  &(currrgm->atom[dist[(i * 2) + 1 ]-1]));
    } /* i */
    /* compute OOP angles */
    /* ( 5, 1, 2, 3 ) */
    currptd->coord[i] = oop3d( &(currrgm->atom[4]), &(currrgm->atom[0]),
			       &(currrgm->atom[1]), &(currrgm->atom[2]));
    i++;
    /* ( 3, 1, 2, 4 ) */
    currptd->coord[i] = oop3d( &(currrgm->atom[3]), &(currrgm->atom[0]),
			       &(currrgm->atom[1]), &(currrgm->atom[2]));
    
#ifdef debugging
    /* print CO bond distances */
    printf( " %d C-O distance: %lf \n", currptd->index, currptd->coord[0] );
#endif

    /* allocate new ptdata node */
    currptd->next  = malloc( sizeof( struct point ) );
    currptd = currptd->next;
    /* 5 distances + 2 OOP angles */
    currptd->coord = malloc( (5 + 2) * sizeof( double ) );
    currptd->next = 0;
    /* move to new geometry */
    currrgm = currrgm->next;
    indexp = indexp + 1;
  } /* while */

}
コード例 #7
0
ファイル: mesh.c プロジェクト: Stanton-e/space-nerds-in-space
struct mesh *init_radar_circle_xz_plane_mesh(double x, double z, double r, int ticks, double tick_radius)
{
	int i;
	struct mesh *my_mesh = malloc(sizeof(*my_mesh));

	if (!my_mesh)
		return my_mesh;
	memset(my_mesh, 0, sizeof(*my_mesh));

	my_mesh->geometry_mode = MESH_GEOMETRY_LINES;
	my_mesh->nvertices = 0;
	my_mesh->ntriangles = 0;
	my_mesh->nlines = 0;
	my_mesh->t = 0;
	my_mesh->v = malloc(sizeof(*my_mesh->v) * (360 / 2 + 1 + ticks*2));
	my_mesh->l = malloc(sizeof(*my_mesh->l) * (1 + ticks));
	my_mesh->radius = dist3d(x, 0, z) + r;
	my_mesh->tex = 0;
	my_mesh->graph_ptr = 0;

	for (i = 0; i <= 360; i += 2) {
		my_mesh->v[my_mesh->nvertices].x = x + cos(i * M_PI / 180.0) * r;
		my_mesh->v[my_mesh->nvertices].y = 0;
		my_mesh->v[my_mesh->nvertices].z = z + sin(i * M_PI / 180.0) * r;
		my_mesh->nvertices++;
	}
	my_mesh->l[0].start = &my_mesh->v[0];
	my_mesh->l[0].end = &my_mesh->v[my_mesh->nvertices - 1];
	my_mesh->l[0].flag = MESH_LINE_STRIP;
	my_mesh->nlines++;

	for (i = 0; i < ticks; ++i) {
		double c = cos(i * 2.0 * M_PI / (double)ticks);
		double s = sin(i * 2.0 * M_PI / (double)ticks);
		mesh_add_point(my_mesh, x + c * (r - tick_radius), 0, z + s * (r - tick_radius));
		mesh_add_point(my_mesh, x + c * r, 0, z + s * r);
		mesh_add_line_last_2(my_mesh, MESH_LINE_DOTTED);
	}

	mesh_graph_dev_init(my_mesh);
	return my_mesh;
}
コード例 #8
0
int mc_server_parse_packet (mc_connection *mc, char *buffer)
{
	int i, ii;
	char buf[128];
	memset(buf,0, 128);
	if (buffer[0] == 0x00) {
		for(i = 2, ii = 0; i < 32; ++i, ++ii) {
			if(buffer[i] == '&') {
				if(i <= 32)
					i += 2;
			}
			buf[ii] = buffer[i];
		} buf[32] = 0;
		printf("Connected through MC to server %s\n",buf);
	}
	else if (buffer[0] == 0x02) {
		mc->mc_server_data.mc_current_size = 0;
		mc->mc_server_data.mc_unparsed_data = malloc(1024 * 1024);
	}
	else if (buffer[0] == 0x03) {
		unsigned short size;
		memcpy(&size, &buffer[1], sizeof(short));
		size = htons(size);
		if (size) {
			memcpy(mc->mc_server_data.mc_unparsed_data + 
			       mc->mc_server_data.mc_current_size, 
			       &buffer[3], size);
			
			mc->mc_server_data.mc_current_size += size;
		}
	}
	else if (buffer[0] == 0x04) {
		short tx,ty,tz;
		memcpy(&tx, &buffer[1], sizeof(short));
		memcpy(&ty, &buffer[3], sizeof(short));
		memcpy(&tz, &buffer[5], sizeof(short));
		mc->mc_server_data.mc_level_x = htons(tx);
		mc->mc_server_data.mc_level_y = htons(ty);
		mc->mc_server_data.mc_level_z = htons(tz);
		printf("Level Dimensions: %d %d %d\n", 
		       mc->mc_server_data.mc_level_x,
		       mc->mc_server_data.mc_level_y,
		       mc->mc_server_data.mc_level_z);

		printf("Prepared to decompress %d bytes\n", mc->mc_server_data.mc_current_size);
		
		FILE *fp = fopen("/Users/nobody1/Desktop/out_c.gz", "w");
		fwrite(mc->mc_server_data.mc_unparsed_data, 1, mc->mc_server_data.mc_current_size, fp);
		fclose(fp);
		
		system("gzip -df /Users/nobody1/Desktop/out_c.gz");
		fp = fopen("/Users/nobody1/Desktop/out_c", "r");
		
		int blocks;
		fread(&blocks, sizeof(int), 1, fp);
		blocks = htonl(blocks);
		printf("%d blocks\n", blocks);
		
		mc->mc_server_data.mc_level_data = malloc(blocks + 1);
		fread(mc->mc_server_data.mc_level_data, 1, blocks, fp);
		
		fclose(fp);
		remove("/Users/nobody1/Desktop/out_c");
		
		mc->mc_server_data.mc_level_size = mc->mc_server_data.mc_level_x * 
						mc->mc_server_data.mc_level_y * 
						mc->mc_server_data.mc_level_z;
		
		free(mc->mc_server_data.mc_unparsed_data);
		
	}
	
	else if (buffer[0] == 0x06){
		int x,y,z;
		char t;
		memcpy(&x, &buffer[1], sizeof(short));
		memcpy(&y, &buffer[3], sizeof(short));
		memcpy(&z, &buffer[5], sizeof(short));
		memcpy(&t, &buffer[7], sizeof(char));
		
		x = htons(x);
		y = htons(y);
		z = htons(z);

		if (mc->mc_mode & MC_LOCK_MAP){
			restore_and_move(mc, t, x, y, z);
		} else if (mc->mc_mode & MC_LOCK_AREA) {
			if (x >= mc->mc_server_data.x1 && x <= mc->mc_server_data.x2 &&
			    y >= mc->mc_server_data.y1 && y <= mc->mc_server_data.y2 &&
			    z >= mc->mc_server_data.z1 && z <= mc->mc_server_data.z2) {
				restore_and_move(mc, t, x, y, z);
			}
		} else if (mc->mc_mode & MC_LOCK_PLAYER) {
			int pid = mc->mc_server_data.mc_pid_locked;
			int xp = mc->mc_server_data.mc_player_db[pid].x;
			int yp = mc->mc_server_data.mc_player_db[pid].y;
			int zp = mc->mc_server_data.mc_player_db[pid].z;
			
			if (xp == 1024 && yp == 1024 && zp == 1024) {
				printf("lost connection to player\n");
			} else {
				if (dist3d(x, y, z, xp, yp, zp) < 10.0f) {
					restore_and_move(mc, t, x, y, z);
				}
			}
		} else {
			mc->mc_server_data.mc_level_data[offset(mc, x, y, z)] = t;
		}
	}
	
	else if (buffer[0] == 0x07) {
		for(i = 2, ii = 0; i < 66; ++i, ++ii) {
			if(buffer[i] == '&') {
				i+=2;}
			if(buffer[i] != ' ') {
				buf[ii] = buffer[i];
			}
		} 
		int spid = buffer[1];
		printf("[SERVER] %s joined the game. (%d)\n",buf,spid);
		if (spid == -1 || !strcmp(buf, mc->mc_client_name)) 
			spid = 256;

		mc->mc_server_data.mc_player_db[spid].pid = spid;
		strcpy(mc->mc_server_data.mc_player_db[spid].name, buf);
		short xp, yp, zp;
		memcpy(&xp, &buffer[2], sizeof(short));
		memcpy(&yp, &buffer[4], sizeof(short));
		memcpy(&zp, &buffer[6], sizeof(short));

		mc->mc_server_data.mc_player_db[spid].x = htons(xp)/32;
		mc->mc_server_data.mc_player_db[spid].y = htons(yp)/32;
		mc->mc_server_data.mc_player_db[spid].z = htons(zp)/32;
		
		mc->mc_server_data.mc_player_db[spid].rotx = buffer[8] * (360/256);
		mc->mc_server_data.mc_player_db[spid].roty = buffer[9] * (360/256);
		
	}
	else if (buffer[0] == 0x08) {
		int spid = buffer[1];
		if (spid == -1) 
			spid = 256;

		short xp, yp, zp;
		memcpy(&xp, &buffer[2], sizeof(short));
		memcpy(&yp, &buffer[4], sizeof(short));
		memcpy(&zp, &buffer[6], sizeof(short));
		
		mc->mc_server_data.mc_player_db[spid].x = htons(xp)/32;
		mc->mc_server_data.mc_player_db[spid].y = htons(yp)/32;
		mc->mc_server_data.mc_player_db[spid].z = htons(zp)/32;
		
		mc->mc_server_data.mc_player_db[spid].rotx = buffer[8] * (360/256);
		mc->mc_server_data.mc_player_db[spid].roty = buffer[9] * (360/256);
		
		if (mc->mc_mode & MC_FOLLOW_PLAYER) {
			follow_move(mc, mc->mc_server_data.mc_pid_locked);
		}
	}
	else if (buffer[0] == 0x09) {
		int spid = buffer[1];
		if (spid == -1) 
			spid = 256;
		
		mc->mc_server_data.mc_player_db[spid].x = buffer[2]/32;
		mc->mc_server_data.mc_player_db[spid].y = buffer[3]/32;
		mc->mc_server_data.mc_player_db[spid].z = buffer[4]/32;
		
		mc->mc_server_data.mc_player_db[spid].rotx = buffer[5] * (360/256);
		mc->mc_server_data.mc_player_db[spid].roty = buffer[6] * (360/256);
		
		if (mc->mc_mode & MC_FOLLOW_PLAYER) {
			follow_move(mc, mc->mc_server_data.mc_pid_locked);
		}
	}
	else if (buffer[0] == 0x0A) {
		int dpid = buffer[1];
		
		if (dpid == -1)
			dpid = 256;
		mc->mc_server_data.mc_player_db[dpid].x += buffer[2]/32;
		mc->mc_server_data.mc_player_db[dpid].y += buffer[3]/32;
		mc->mc_server_data.mc_player_db[dpid].z += buffer[4]/32;
		
		if (mc->mc_mode & MC_FOLLOW_PLAYER) {
			follow_move(mc, mc->mc_server_data.mc_pid_locked);
		}
	}
	else if (buffer[0] == 0x0B) {
		int dpid = buffer[1];
		mc->mc_server_data.mc_player_db[dpid].rotx = buffer[2] * (360/256);
		mc->mc_server_data.mc_player_db[dpid].roty = buffer[3] * (360/256);
		
		if (mc->mc_mode & MC_FOLLOW_PLAYER) {
			follow_move(mc, mc->mc_server_data.mc_pid_locked);
		}
		
	}
	else if (buffer[0] == 0x0C) {
		int piddc = buffer[1];
		printf("[SERVER] %s left the game.\n", mc->mc_server_data.mc_player_db[piddc].name);
	}


	else if (buffer[0] == 0x0D) {
		for(i = 2, ii = 0; i < 66; ++i, ++ii) {
			if(buffer[i] == '&') {
				if(i <= 64)
					i += 2;
			}
			buf[ii] = buffer[i];
		} buf[64] = 0;
		
		printf("%s\n",buf);
	}
	else if (buffer[0] == 0x0E) {
		printf("[DISCONNECT] %s\n",buffer);
		return -1;
	}
	return MC_SEND;
}
コード例 #9
0
ファイル: hscmds.c プロジェクト: jrsteensen/hspace3g
/* send a standard radio communication */
void send_com(dbref from, char *arg_left, char *arg_right)
{
  dbref com, obj;
  hship *ship;
  hcelestial *cel;
  huniverse *uid;
  
  double xmit, rcv;
  char contact[32];
  char *r, *s;
  char buff[128];
  ATTR *a;
  double sx, sy, sz, tx, ty, tz, dist;
  char pre[128];
  char *mesg;
  int sent_to_from, send_to_com;
  
  if (!IsComm(from))
  {
    notify(from, "You do not have the HS_COMM flag.");
    return;
  }
  
  uid = NULL;
  obj = atr_parse_dbref(from, "HSPACE");
  if (!RealGoodObject(obj))
  {
    notify(from, "You do not have a valid space id. Board, disembark, eject, or man a console.");
    return;
  }
  
  if (IsShip(obj))
  {
    ship = find_ship_by_nav(obj);
    if (!ship)
    {
      notify(from, "Your space id is not a valid ship.");
      return;
    }
    
    if (ship->uid)
    {
      sx = ship->x;
      sy = ship->y;
      sz = ship->z;
      uid = ship->uid;
    }
    else if (ship->landed)
    {
      sx = ship->landed->x;
      sy = ship->landed->y;
      sz = ship->landed->z;
      uid = ship->landed->uid;
    }
    else if (ship->docked)
    {
      sx = ship->docked->x;
      sy = ship->docked->y;
      sz = ship->docked->z;
      uid = ship->docked->uid;
    }
    
    strncpy(contact, ship_name(ship), 10);
  }
  else if (IsCelestial(obj))
  {
    cel = find_celestial(obj);
    if (!cel)
    {
      notify(from, "Your space id is not a valid celestial.");
      return;
    }
    
    sx = cel->x;
    sy = cel->y;
    sz = cel->z;
    uid = cel->uid;

    strncpy(contact, celestial_name(cel), 10);
  }
  contact[10] = '\0';
  
  if (!uid)
  {
    notify(from, "Your space id does not have a valid uid.");
    return;
  }
  
  if (arg_left && arg_right && *arg_right)
  {
    xmit = strtod(arg_left, &s);
    
    if (s && *s)
    {
      return;
    }
    mesg = arg_right;
  } else {
    xmit = atr_parse_double(from, "TRANSMIT", 0.0);
    mesg = arg_left;
  }
  if (xmit < 100.0 || xmit > 999.9)
  {
    notify(from, "Transmission frequency must be between 100 and 999 MHz.");
    return;
  }
  
  a = atr_get(from, "CALLSIGN");
  if (!a)
  {
    snprintf(pre, 127,
         "%s%s[%s%5.1f MHz%s%s]-[%s%-10s%s]-[%s ",
         ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL, xmit, ANSI_HILITE, ANSI_BLUE, ANSI_GREEN, contact,
         ANSI_BLUE, ANSI_NORMAL);
  }
  else
  {
    snprintf(pre, 127,
         "%s%s[%s%5.1f MHz%s%s]-[%s%-10s%s]-[%s %s<%s%s%s>%s ",
         ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL, xmit, ANSI_HILITE, ANSI_BLUE, ANSI_GREEN, contact,
         ANSI_BLUE, ANSI_NORMAL, ANSI_CYAN, ANSI_NORMAL, atr_value(a), ANSI_CYAN, ANSI_NORMAL);
  }

  /* go through the comm list and check each one */
  sent_to_from = 0;
  for (com = 0; com < db_top; com++)
  {
    if (!IsComm(com))
      continue;
    
    /* check if the user is in the same uid */
    obj = atr_parse_dbref(com, "HSPACE");
    if (IsShip(obj))
    {
      ship = find_ship_by_nav(obj);
      if (!ship)
        continue;
      
      if (ship->uid && ship->uid != uid)
        continue;
      else if (ship->landed && ship->landed->uid != uid)
        continue;
      else if (ship->docked && ship->docked->uid != uid)
        continue;
      
      if (ship->uid)
      {
        tx = ship->x;
        ty = ship->y;
        tz = ship->z;
      }
      else if (ship->landed)
      {
        tx = ship->landed->x;
        ty = ship->landed->y;
        tz = ship->landed->z;
      }
      else if (ship->docked)
      {
        tx = ship->docked->x;
        ty = ship->docked->y;
        tz = ship->docked->z;
      }
    }
    else if (IsCelestial(obj))
    {
      cel = find_celestial(obj);
      if (!cel)
        continue;
      
      if (cel->uid != uid)
        continue;
      
      tx = cel->x;
      ty = cel->y;
      tz = cel->z;
    } else {
      continue;
    }
    
    dist = dist3d(sx, sy, sz, tx, ty, tz) / hs_options.max_comm_dist;
    if (dist > 1.0)
      continue;

    a = atr_get(com, "FREQUENCY");
    if (!a)
      continue;
    
    /* check all frequencies to see if we need to send to this com */
    send_to_com = 0;
    snprintf(buff, 127, atr_value(a));
    s = buff;
    while (s)
    {
      r = split_token(&s, ' ');
      rcv = parse_number(r);
      
      /* check to see if we're on the right frequency */
      if (fabs(rcv - xmit) < 0.1)
      {
        send_to_com = 1;
        break;
      }
    }
    
    if (send_to_com)
    {
      if (com == from)
        sent_to_from = 1;
      
      notify_format(com, "%s%s%s%s]%s", pre, decay_msg(mesg, dist), ANSI_HILITE, ANSI_BLUE, ANSI_NORMAL);
    }
  }
  
  if (!sent_to_from)
  {
    notify_format(from, "You send \"%s\" on frequency %5.1f.", mesg, xmit);
  }
}