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; }
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); }
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(); }
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(); }
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(×, 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); }