void palGenericLink::Init(palBodyBase *parent, palBodyBase *child,
	const palVector3& pivotLocation,
	const palVector3& linearLowerLimits,
	const palVector3& linearUpperLimits,
	const palVector3& angularLowerLimits,
	const palVector3& angularUpperLimits)
{
	/* Even though we'll only use the location of the pivot and not
	 * its orientation, we need to account for rotation of the parent
	 * and child bodies because we need the location of the pivot in
	 * their frames of reference, which might be rotated. (For
	 * example, if the parent is translated by (-5,0,0) and rotated 90
	 * degrees clockwise about z, the global origin isn't just
	 * translated for the parent to (5,0,0), it's rotated to be at
	 * (0,5,0) in the parent's coordinate system.) */
	palMatrix4x4 worldToParent;
	mat_invert(&worldToParent, &parent->GetLocationMatrix());
	palVector3 pivotInParent;
	vec_mat_transform(&pivotInParent, &worldToParent, &pivotLocation);

	palMatrix4x4 worldToChild;
	mat_invert(&worldToChild, &child->GetLocationMatrix());
	palVector3 pivotInChild;
	vec_mat_transform(&pivotInChild, &worldToChild, &pivotLocation);

	palMatrix4x4 frameInParent;
	mat_identity(&frameInParent);
	palMatrix4x4 frameInChild;
	mat_identity(&frameInChild);

	mat_set_translation(&frameInParent, pivotInParent.x, pivotInParent.y, pivotInParent.z);
	mat_set_translation(&frameInChild, pivotInChild.x, pivotInChild.y, pivotInChild.z);

	Init(parent, child, frameInParent, frameInChild, linearLowerLimits, linearUpperLimits, angularLowerLimits, angularUpperLimits);
}
void palRevoluteLink::GetPosition(palVector3& pos) const {
	//Convert link_rel to the global coordinate system
	//Link_abs=(Link_rel * R_Inv) - parent_abs

	//Transpose the matrix to get Normal rotation matrixes.
	palMatrix4x4 a_PAL = m_pParent->GetLocationMatrix();
	palMatrix4x4 a; 										//R
	mat_transpose(&a, &a_PAL);

	palMatrix4x4 a_inv;										//R_Inv
	palVector3 link_rel;
	palVector3 link_abs;

	link_rel.x =m_fRelativePosX;
	link_rel.y =m_fRelativePosY;
	link_rel.z =m_fRelativePosZ;

	bool isInverted = mat_invert(&a_inv,&a);
	if(!isInverted)
		return;

	vec_mat_mul(&link_abs,&a_inv,&link_rel);
	palVector3 posVec;
	m_pParent->GetPosition(posVec);
	pos.x = link_abs.x + posVec.x;
	pos.y = link_abs.y + posVec.y;
	pos.z = link_abs.z + posVec.z;

}
示例#3
0
文件: model-iqm.c 项目: mksn/objview
static void
_load_bones (struct ov_skeleton *s,
             unsigned char       *data,
             struct _iqm_header  *h)
{
    struct _iqm_joint *j = malloc(h->num_joints * sizeof(struct _iqm_joint));
    memcpy(j, data + h->ofs_joints, h->num_joints * sizeof(struct _iqm_joint));
    s->num_bones = h->num_joints;
    s->bones = malloc(h->num_joints * sizeof(struct iqm_bone));
    int i;
    for (i=0; i<h->num_joints; i++) {
        float q[16];
        char *name = (char *)(data + h->ofs_text + j[i].name);
        
        s->bones[i].parent = j[i].parent;
        s->bones[i].name = malloc(strlen(name)*sizeof(char)+1);
        strcpy(s->bones[i].name, name);
        read_pose(&s->bones[i].bind_pose, &j[i]);
        mat_from_pose(q,
                      s->bones[i].bind_pose.translate,
                      s->bones[i].bind_pose.rotate,
                      s->bones[i].bind_pose.scale);
        if (s->bones[i].parent >= 0) {
            struct ov_bone *parent = &s->bones[s->bones[i].parent];
            mat_mul44(s->bones[i].bind_matrix, parent->bind_matrix, q);
        } else {
            mat_copy(s->bones[i].bind_matrix, q);
        }
        mat_invert(s->bones[i].inv_bind_matrix, s->bones[i].bind_matrix);
    }
    free (j);
}
示例#4
0
文件: render.c 项目: ccxvii/mio
void render_point_lamp(struct lamp *lamp, mat4 clip_from_view, mat4 view_from_world, mat4 lamp_transform)
{
	static int prog = 0;
	static int uni_viewport;
	static int uni_view_from_clip;
	static int uni_lamp_position;
	static int uni_lamp_color;
	static int uni_lamp_distance;
	static int uni_use_sphere;

	mat4 view_from_clip;
	vec2 viewport;
	vec3 lamp_position;
	vec3 lamp_color;

	if (!prog) {
		prog = compile_shader(quad_vert_src, point_frag_src);
		uni_viewport = glGetUniformLocation(prog, "viewport");
		uni_view_from_clip = glGetUniformLocation(prog, "view_from_clip");
		uni_lamp_position = glGetUniformLocation(prog, "lamp_position");
		uni_lamp_color = glGetUniformLocation(prog, "lamp_color");
		uni_lamp_distance = glGetUniformLocation(prog, "lamp_distance");
		uni_use_sphere = glGetUniformLocation(prog, "use_sphere");
	}

	mat_invert(view_from_clip, clip_from_view);

	viewport[0] = fbo_w;
	viewport[1] = fbo_h;

	mat_vec_mul(lamp_position, view_from_world, lamp_transform + 12);
	vec_scale(lamp_color, lamp->color, lamp->energy);

	glUseProgram(prog);
	glUniform2fv(uni_viewport, 1, viewport);
	glUniformMatrix4fv(uni_view_from_clip, 1, 0, view_from_clip);
	glUniform3fv(uni_lamp_position, 1, lamp_position);
	glUniform3fv(uni_lamp_color, 1, lamp_color);
	glUniform1f(uni_lamp_distance, lamp->distance);
	glUniform1i(uni_use_sphere, lamp->use_sphere);

	draw_fullscreen_quad();
}
示例#5
0
文件: render.c 项目: ccxvii/mio
void render_spot_lamp(struct lamp *lamp, mat4 clip_from_view, mat4 view_from_world, mat4 lamp_transform)
{
	static int prog = 0;
	static int uni_viewport;
	static int uni_view_from_clip;
	static int uni_lamp_position;
	static int uni_lamp_direction;
	static int uni_lamp_color;
	static int uni_lamp_distance;
	static int uni_spot_size;
	static int uni_spot_blend;
	static int uni_use_sphere;

	static const vec3 lamp_direction_init = { 0, 0, 1 };

	mat4 view_from_clip;
	vec2 viewport;
	vec3 lamp_position;
	vec3 lamp_direction_world;
	vec3 lamp_direction_view;
	vec3 lamp_direction;
	vec3 lamp_color;
	float spot_size;
	float spot_blend;

	if (!prog) {
		prog = compile_shader(quad_vert_src, spot_frag_src);
		uni_viewport = glGetUniformLocation(prog, "viewport");
		uni_view_from_clip = glGetUniformLocation(prog, "view_from_clip");
		uni_lamp_position = glGetUniformLocation(prog, "lamp_position");
		uni_lamp_direction = glGetUniformLocation(prog, "lamp_direction");
		uni_lamp_color = glGetUniformLocation(prog, "lamp_color");
		uni_lamp_distance = glGetUniformLocation(prog, "lamp_distance");
		uni_spot_size = glGetUniformLocation(prog, "spot_size");
		uni_spot_blend = glGetUniformLocation(prog, "spot_blend");
		uni_use_sphere = glGetUniformLocation(prog, "use_sphere");
	}

	mat_invert(view_from_clip, clip_from_view);

	viewport[0] = fbo_w;
	viewport[1] = fbo_h;

	mat_vec_mul(lamp_position, view_from_world, lamp_transform + 12);

	mat_vec_mul_n(lamp_direction_world, lamp_transform, lamp_direction_init);
	mat_vec_mul_n(lamp_direction_view, view_from_world, lamp_direction_world);
	vec_normalize(lamp_direction, lamp_direction_view);

	vec_scale(lamp_color, lamp->color, lamp->energy);

	spot_size = cos(M_PI * lamp->spot_angle / 360.0);
	spot_blend = (1.0 - spot_size) * lamp->spot_blend;

	glUseProgram(prog);
	glUniform2fv(uni_viewport, 1, viewport);
	glUniformMatrix4fv(uni_view_from_clip, 1, 0, view_from_clip);
	glUniform3fv(uni_lamp_position, 1, lamp_position);
	glUniform3fv(uni_lamp_direction, 1, lamp_direction);
	glUniform3fv(uni_lamp_color, 1, lamp_color);
	glUniform1f(uni_lamp_distance, lamp->distance);
	glUniform1f(uni_spot_size, spot_size);
	glUniform1f(uni_spot_blend, spot_blend);
	glUniform1i(uni_use_sphere, lamp->use_sphere);

	draw_fullscreen_quad();
}
示例#6
0
void * glclient_thread(void * arg)
{
  server_thread_args_t * a = (server_thread_args_t *)arg;
  static graphics_context_t gc;

  static struct js_event joy;
  int joy_fd;
  static char button[32];

  glclient_context_t *glcc = a->user_context_ptr;

  joy_fd = open(glcc->joy_dev, O_RDONLY);
  if (joy_fd == -1)
  {
    printf("Error: Joystick device open\n");
  }
  if (joy_fd != -1)
  {
    fcntl(joy_fd, F_SETFL, O_NONBLOCK);
  }

  gls_init(a);

  gls_cmd_get_context();
  gc.screen_width = glsc_global.screen_width;
  gc.screen_height = glsc_global.screen_height;
  printf("width:%d height:%d\n",glsc_global.screen_width,glsc_global.screen_height);
  init_gl(&gc);

  float aspect = (float)gc.screen_width / (float)gc.screen_height;

  mat_perspective(proj_mat, aspect, 0.1f, 1024.0f, 60.0f);
  glUniform4fv(gc.uloc_light, 1, light_pos);

  srand(0x12345678);
  int j;
  for (j = 0; j < 1024; j++)
  {
    obj[j].z = randf() * 8.0f - 10.0f;
    obj[j].x = (randf() * 2.0f - 1.0f) * obj[j].z;
    obj[j].y = (randf() * 1.0f - 0.5f) * obj[j].z;
    obj[j].dx = randf() * 0.0f - 0.0f;
    obj[j].dy = randf() * 0.0f - 0.0f;
    obj[j].dz = randf() * 0.0f - 0.0f;
    obj[j].rx = randf() * 6.28;
    obj[j].ry = randf() * 6.28;
    obj[j].rz = randf() * 6.28;
    obj[j].drx = randf() * 0.1f - 0.05f;
    obj[j].dry = randf() * 0.1f - 0.05f;
    obj[j].drz = randf() * 0.1f - 0.05f;
  }

  float x = 1.57f;
  float y = 0.0f;
  float z = -2.0f;
  int k = 1;

  int i;
  for (i = 0; i < 432000; i++)
  {
    struct timeval times, timee;
    gettimeofday(&times, NULL);

    if (joy_fd != -1)
    {
      while (read(joy_fd, &joy, sizeof(struct js_event)) == sizeof(struct js_event))
      {
        if ((joy.type & JS_EVENT_BUTTON) == JS_EVENT_BUTTON)
        {
          button[joy.number] = joy.value;
        }
      }

      if (button[4] > 0)
      {
        y += 0.01f;
      }
      if (button[6] > 0)
      {
        y += -0.01f;
      }
      if (button[5] > 0)
      {
        x += 0.01f * aspect;
      }
      if (button[7] > 0)
      {
        x += -0.01f * aspect;
      }
      if (button[12] > 0)
      {
        z += -0.01f;
      }
      if (button[13] > 0)
      {
        k++;
        k = (k > 45) ? 45 : k;
      }
      if (button[14] > 0)
      {
        z += 0.01f;
      }
      if (button[15] > 0)
      {
        k--;
        k = (k < 1) ? 1 : k;
      }
    }

    glUseProgram(gc.program);
    glBindBuffer(GL_ARRAY_BUFFER, gc.vbo_pos);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gc.vbo_ind);
    glEnableVertexAttribArray(gc.vloc_pos);
    glEnableVertexAttribArray(gc.vloc_nor);
    glEnableVertexAttribArray(gc.vloc_tex);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    for (j = 0; j < k; j++)
    {
      obj[j].rx += obj[j].drx;
      obj[j].ry += obj[j].dry;
      obj[j].rz += obj[j].drz;

      if (j == 0)
      {
        obj[j].x = 0.0f;
        obj[j].y = 0.0f;
        obj[j].z = z;
        obj[j].rx = -y;
        obj[j].ry = x;
        obj[j].rz = 0.0f;
      }

      mat_identity(model_mat);
      mat_translate(model_mat, obj[j].x, obj[j].y, obj[j].z);
      mat_rotate_x(model_mat, obj[j].rx);
      mat_rotate_y(model_mat, obj[j].ry);
      mat_rotate_z(model_mat, obj[j].rz);

      mat_copy(nor_mat, model_mat);
      mat_invert(nor_mat);
      mat_transpose(nor_mat);
      glUniformMatrix4fv(gc.uloc_nor, 1, GL_FALSE, nor_mat);
      mat_copy(obj[j].nor_mat, nor_mat);

      mat_copy(modelproj_mat, proj_mat);
      mat_mul(modelproj_mat, model_mat);
      glUniformMatrix4fv(gc.uloc_model, 1, GL_FALSE, modelproj_mat);
      mat_copy(obj[j].modelproj_mat, modelproj_mat);

      glDrawElements(GL_TRIANGLES, sizeof(ind_model) / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
    }
    glDisableVertexAttribArray(gc.vloc_tex);
    glDisableVertexAttribArray(gc.vloc_nor);
    glDisableVertexAttribArray(gc.vloc_pos);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    gls_cmd_flip(i);
    gettimeofday(&timee, NULL);
    //printf("%d:%f ms ", i, get_diff_time(times, timee) * 1000.0f);
  }
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  gls_cmd_flip(i);
  release_gl(&gc);
  gls_free();
  if (joy_fd != -1)
  {
    close(joy_fd);
  }
  pthread_exit(NULL);
}