void idle(void) { static int frames; static float time; float ifps; vec3 v; vec4 q0,q1,q2; matrix m; ifps = 1.0 / getfps(); if(!my_pause) angle += ifps * 360.0 / 4.0; v_set(sin(angle * DEG2RAD / 3),cos(angle * DEG2RAD / 7),2,light); v_set(0,0,1,v); q_set(v,psi,q0); v_set(0,1,0,v); q_set(v,phi,q1); q_multiply(q0,q1,q2); q_to_matrix(q2,m); v_set(dist,0,0,camera); v_transform(camera,m,camera); v_add(camera,mesh,camera); frames++; time += ifps; if(time > 1.0) { printf("%d frames %.2f fps\n",frames,(float)frames / time); frames = 0; time = 0; } }
autoConfiguration Configuration_and_AffineTransform_to_Configuration (Configuration me, AffineTransform thee) { try { if (my numberOfColumns != thy n) { Melder_throw (U"Dimensions do not agree."); } autoConfiguration him = Data_copy (me); // Apply transformation YT thy v_transform (my data, my numberOfRows, his data); return him; } catch (MelderError) { Melder_throw (U"Configuration not created."); } }
void sm_frame(sm_t *sm,int from,int to,float frame) { int i,frame0,frame1; if(from == -1) from = 0; if(to == -1) to = sm->num_frame; frame0 = (int)frame; frame -= frame0; frame0 += from; if(frame0 >= to) frame0 = ((frame0 - from) % (to - from)) + from; frame1 = frame0 + 1; if(frame1 >= to) frame1 = from; for(i = 0; i < sm->num_bone; i++) { float m0[16],m1[16]; float xyz0[3],xyz1[3],xyz[3],rot[4]; v_scale(sm->frame[frame0][i].xyz,1.0 - frame,xyz0); v_scale(sm->frame[frame1][i].xyz,frame,xyz1); v_add(xyz0,xyz1,xyz); q_slerp(sm->frame[frame0][i].rot,sm->frame[frame1][i].rot,frame,rot); m_translate(xyz,m0); q_to_matrix(rot,m1); m_multiply(m0,m1,sm->bone[i].matrix); } for(i = 0; i < sm->num_surface; i++) { int j; sm_surface_t *s = sm->surface[i]; for(j = 0; j < s->num_vertex; j++) { int k; v_set(0,0,0,s->vertex[j].xyz); v_set(0,0,0,s->vertex[j].normal); for(k = 0; k < s->vertex[j].num_weight; k++) { float v[3]; sm_weight_t *w = &s->vertex[j].weight[k]; v_transform(w->xyz,sm->bone[w->bone].matrix,v); v_scale(v,w->weight,v); v_add(s->vertex[j].xyz,v,s->vertex[j].xyz); v_transform_normal(w->normal,sm->bone[w->bone].matrix,v); v_scale(v,w->weight,v); v_add(s->vertex[j].normal,v,s->vertex[j].normal); } } } }