static btTransform get_transform(ErlNifEnv *env, const ERL_NIF_TERM arg) { double x,y,z,w; const ERL_NIF_TERM *tuple; int arity; enif_get_tuple(env, arg, &arity, &tuple); return btTransform(get_quaternion(env,tuple[0]),get_vector(env,tuple[1])); }
glm::mat4 Position::get_pos_mat() { if (!updated){ if (parent_pos) { return parent_pos->get_pos_mat()*pos_matrix; }else{ return pos_matrix; } } pos_matrix = glm::mat4(1.0f); if(pos!=glm::vec3(0,0,0)){ pos_matrix *= glm::translate(pos); } if(rotated_x||rotated_y||rotated_z){ glm::quat total; if (rotated_x) { quat_x = get_quaternion(glm::vec3(1, 0, 0), r.x); rotated_x=false; } if (rotated_y) { quat_y = get_quaternion(glm::vec3(0, 1, 0), r.y); //glm::mat4 rmat = glm::rotate(r.y, glm::vec3(0, 1, 0)); rotated_y=false; } if (rotated_z) { quat_z = get_quaternion(glm::vec3(0, 0, 1), r.z); rotated_z=false; } r_mat=glm::mat4_cast(glm::cross(glm::cross(quat_y,quat_x),quat_z)); } if(r.x!=0.0||r.y!=0.0||r.z!=0.0){ pos_matrix *= r_mat; } if(scale!=glm::vec3(1,1,1)){ pos_matrix *=glm::scale(scale); } updated = false; if (parent_pos) { return parent_pos->get_pos_mat()*pos_matrix; }else{ return pos_matrix; } }
glm::mat4 Position::get_rotate_mat(){ if(rotated_x||rotated_y||rotated_z){ glm::quat total; if (rotated_x) { quat_x = get_quaternion(glm::vec3(1, 0, 0), r.x); rotated_x=false; } if (rotated_y) { quat_y = get_quaternion(glm::vec3(0, 1, 0), r.y); //glm::mat4 rmat = glm::rotate(r.y, glm::vec3(0, 1, 0)); rotated_y=false; } if (rotated_z) { quat_z = get_quaternion(glm::vec3(0, 0, 1), r.z); rotated_z=false; } r_mat=glm::mat4_cast(glm::cross(glm::cross(quat_y,quat_x),quat_z)); } return r_mat; }
glm::mat4 Position::gen_rotate_mat(glm::vec3 axis,float angle){ return glm::mat4_cast(get_quaternion(axis,angle)); }