static int Quaternion_angle_set(QuaternionObject *self, PyObject *value, void *UNUSED(closure)) { float tquat[4]; float len; float axis[3], angle_dummy; float angle; if (BaseMath_ReadCallback(self) == -1) return -1; len = normalize_qt_qt(tquat, self->quat); quat_to_axis_angle(axis, &angle_dummy, tquat); angle = PyFloat_AsDouble(value); if (angle == -1.0f && PyErr_Occurred()) { /* parsed item not a number */ PyErr_SetString(PyExc_TypeError, "Quaternion.angle = value: float expected"); return -1; } angle = angle_wrap_rad(angle); quat__axis_angle_sanitize(axis, &angle); axis_angle_to_quat(self->quat, axis, angle); mul_qt_fl(self->quat, len); if (BaseMath_WriteCallback(self) == -1) return -1; return 0; }
static int Quaternion_axis_vector_set(QuaternionObject *self, PyObject *value, void *UNUSED(closure)) { float tquat[4]; float len; float axis[3]; float angle; if (BaseMath_ReadCallback(self) == -1) return -1; len = normalize_qt_qt(tquat, self->quat); quat_to_axis_angle(axis, &angle, tquat); /* axis value is unused */ if (mathutils_array_parse(axis, 3, 3, value, "quat.axis = other") == -1) return -1; quat__axis_angle_sanitize(axis, &angle); axis_angle_to_quat(self->quat, axis, angle); mul_qt_fl(self->quat, len); if (BaseMath_WriteCallback(self) == -1) return -1; return 0; }
static PyObject *Quaternion_axis_vector_get(QuaternionObject *self, void *UNUSED(closure)) { float tquat[4]; float axis[3]; float angle_dummy; if (BaseMath_ReadCallback(self) == -1) return NULL; normalize_qt_qt(tquat, self->quat); quat_to_axis_angle(axis, &angle_dummy, tquat); quat__axis_angle_sanitize(axis, NULL); return Vector_CreatePyObject(axis, 3, Py_NEW, NULL); }
static PyObject *Quaternion_to_axis_angle(QuaternionObject *self) { PyObject *ret; float tquat[4]; float axis[3]; float angle; if (BaseMath_ReadCallback(self) == -1) return NULL; normalize_qt_qt(tquat, self->quat); quat_to_axis_angle(axis, &angle, tquat); quat__axis_angle_sanitize(axis, &angle); ret = PyTuple_New(2); PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(axis, 3, Py_NEW, NULL)); PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(angle)); return ret; }
int32_t main(int32_t argc, char *argv[]) { printf("<<watchlist//>>\n"); if( init_sdl2() ) { return 1; } int32_t width = 1280; int32_t height = 720; SDL_Window* window; sdl2_window("cute3d: " __FILE__, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, &window); SDL_GLContext* context; sdl2_glcontext(3, 2, window, &context); if( init_shader() ) { return 1; } if( init_canvas(width, height) ) { return 1; } canvas_create("global_dynamic_canvas", &global_dynamic_canvas); struct Arcball arcball = {0}; arcball_create(width, height, (Vec4f){0.0,6.0,10.0,1.0}, (Vec4f){0.0,0.0,0.0,1.0}, 0.001f, 100.0, &arcball); struct GameTime time = {0}; gametime_create(1.0f / 60.0f, &time); Vec4f a = {0.0f, 0.0f, 1.0f}; Vec4f b = {1.0f, 0.0f, 1.0f}; draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){25, 255, 25, 255}, 0.01f, a, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 1.0f); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 25, 25, 255}, 0.01f, b, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 1.0f); Quat axis_angle_rot = {0}; quat_from_axis_angle((Vec4f)Y_AXIS, PI/4, axis_angle_rot); draw_quaternion(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 255, 255, 255}, (Color){255, 0, 255, 255}, 0.01f, axis_angle_rot, 2.0f); vec_print("axis_angle_rot: ", axis_angle_rot); Vec4f axis_angle_result = {0}; vec_rotate(a, axis_angle_rot, axis_angle_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 255, 25, 255}, 0.01f, axis_angle_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 2.0f); Vec4f axis = {0}; float angle = 0.0f; quat_to_axis_angle(axis_angle_rot, axis, &angle); Quat axis_angle_rot2 = {0}; quat_from_axis_angle(axis, angle, axis_angle_rot2); vec_print("axis_angle_rot2: ", axis_angle_rot2); Quat euler_angles_rot = {0}; quat_from_euler_angles(0.0f, PI/4, 0.0f, euler_angles_rot); vec_print("euler_angles_rot: ", euler_angles_rot); Vec4f euler_angles_result = {0}; vec_rotate(a, euler_angles_rot, euler_angles_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){25, 255, 255, 255}, 0.01f, euler_angles_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 3.0f); Quat vec_pair_rot = {0}; quat_from_vec_pair(a, b, vec_pair_rot); vec_print("vec_pair_rot: ", vec_pair_rot); Vec4f vec_pair_result = {0}; vec_rotate(a, vec_pair_rot, vec_pair_result); draw_vec(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){255, 25, 255, 255}, 0.01f, vec_pair_result, (Vec3f){0.0f, 0.0f, 0.0f}, 1.0f, 4.0f); Mat xaxis_control = {0}; xaxis_control[0] = 1; xaxis_control[4] = 0; xaxis_control[8] = 0; xaxis_control[12] = 0; xaxis_control[1] = 0; xaxis_control[5] = cosf(PI/4); xaxis_control[9] = -sinf(PI/4); xaxis_control[13] = 0; xaxis_control[2] = 0; xaxis_control[6] = sinf(PI/4); xaxis_control[10] = cosf(PI/4); xaxis_control[14] = 0; xaxis_control[3] = 0; xaxis_control[7] = 0; xaxis_control[11] = 0; xaxis_control[15] = 1; mat_print("xaxis_control: ", xaxis_control); Quat xaxis_rot = {0}; quat_from_axis_angle((Vec4f)X_AXIS, PI/4, xaxis_rot); Mat xaxis_mat = {0}; quat_to_mat(xaxis_rot, xaxis_mat); mat_print("xaxis_mat: ", xaxis_mat); Mat yaxis_control = {0}; yaxis_control[0] = cosf(PI/4); yaxis_control[4] = 0; yaxis_control[8] = sinf(PI/4); yaxis_control[12] = 0; yaxis_control[1] = 0; yaxis_control[5] = 1; yaxis_control[9] = 0; yaxis_control[13] = 0; yaxis_control[2] = -sinf(PI/4); yaxis_control[6] = 0; yaxis_control[10] = cosf(PI/4); yaxis_control[14] = 0; yaxis_control[3] = 0; yaxis_control[7] = 0; yaxis_control[11] = 0; yaxis_control[15] = 1; mat_print("yaxis_control: ", yaxis_control); Quat yaxis_rot = {0}; quat_from_axis_angle((Vec4f)Y_AXIS, PI/4, yaxis_rot); Mat yaxis_mat = {0}; quat_to_mat(yaxis_rot, yaxis_mat); mat_print("yaxis_mat: ", yaxis_mat); Mat zaxis_control = {0}; zaxis_control[0] = cosf(PI/4); zaxis_control[4] = -sinf(PI/4); zaxis_control[8] = 0; zaxis_control[12] = 0; zaxis_control[1] = sinf(PI/4); zaxis_control[5] = cosf(PI/4); zaxis_control[9] = 0; zaxis_control[13] = 0; zaxis_control[2] = 0; zaxis_control[6] = 0; zaxis_control[10] = 1; zaxis_control[14] = 0; zaxis_control[3] = 0; zaxis_control[7] = 0; zaxis_control[11] = 0; zaxis_control[15] = 1; mat_print("zaxis_control: ", zaxis_control); Quat zaxis_rot = {0}; quat_from_axis_angle((Vec4f)Z_AXIS, PI/4, zaxis_rot); Mat zaxis_mat = {0}; quat_to_mat(zaxis_rot, zaxis_mat); mat_print("zaxis_mat: ", zaxis_mat); draw_grid(&global_static_canvas, 0, (Mat)IDENTITY_MAT, (Color){120, 120, 120, 255}, 0.01f, 12.0f, 12.0f, 12); while(true) { SDL_Event event; while( sdl2_poll_event(&event) ) { if( sdl2_handle_quit(event) ) { goto done; } sdl2_handle_resize(event); arcball_handle_resize(&arcball, event); arcball_handle_mouse(&arcball, event); } sdl2_gl_set_swap_interval(0); ogl_debug( glClearDepth(1.0f); glClearColor(.0f, .0f, .0f, 1.0f); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ); gametime_advance(&time, sdl2_time_delta()); gametime_integrate(&time); canvas_render_layers(&global_static_canvas, 0, MAX_CANVAS_LAYERS, &arcball.camera, (Mat)IDENTITY_MAT); sdl2_gl_swap_window(window); }
static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); // Object *obedit= CTX_data_edit_object(C); View3D *v3d= CTX_wm_view3d(C); // BoundBox *bb; Object *ob= OBACT; TransformProperties *tfp= v3d->properties_storage; switch(event) { case B_REDR: ED_area_tag_redraw(CTX_wm_area(C)); return; /* no notifier! */ case B_OBJECTPANEL: DAG_id_tag_update(&ob->id, OB_RECALC_OB); break; case B_OBJECTPANELMEDIAN: if(ob) { v3d_editvertex_buts(NULL, v3d, ob, 1.0); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); } break; /* note; this case also used for parbone */ case B_OBJECTPANELPARENT: if(ob) { if(ob->id.lib || test_parent_loop(ob->parent, ob) ) ob->parent= NULL; else { DAG_scene_sort(bmain, scene); DAG_id_tag_update(&ob->id, OB_RECALC_OB); } } break; case B_ARMATUREPANEL3: // rotate button on channel { bPoseChannel *pchan; float eul[3]; pchan= get_active_posechannel(ob); if (!pchan) return; /* make a copy to eul[3], to allow TAB on buttons to work */ eul[0]= (float)M_PI*tfp->ob_eul[0]/180.0f; eul[1]= (float)M_PI*tfp->ob_eul[1]/180.0f; eul[2]= (float)M_PI*tfp->ob_eul[2]/180.0f; if (pchan->rotmode == ROT_MODE_AXISANGLE) { float quat[4]; /* convert to axis-angle, passing through quats */ eul_to_quat( quat,eul); quat_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,quat); } else if (pchan->rotmode == ROT_MODE_QUAT) eul_to_quat( pchan->quat,eul); else copy_v3_v3(pchan->eul, eul); } /* no break, pass on */ case B_ARMATUREPANEL2: { ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); } break; case B_TRANSFORMSPACEADD: { char names[sizeof(((TransformOrientation *)NULL)->name)]= ""; BIF_createTransformOrientation(C, NULL, names, 1, 0); break; } case B_TRANSFORMSPACECLEAR: BIF_clearTransformOrientation(C); break; #if 0 // XXX case B_WEIGHT0_0: wpaint->weight = 0.0f; break; case B_WEIGHT1_4: wpaint->weight = 0.25f; break; case B_WEIGHT1_2: wpaint->weight = 0.5f; break; case B_WEIGHT3_4: wpaint->weight = 0.75f; break; case B_WEIGHT1_0: wpaint->weight = 1.0f; break; case B_OPA1_8: wpaint->a = 0.125f; break; case B_OPA1_4: wpaint->a = 0.25f; break; case B_OPA1_2: wpaint->a = 0.5f; break; case B_OPA3_4: wpaint->a = 0.75f; break; case B_OPA1_0: wpaint->a = 1.0f; break; #endif case B_CLR_WPAINT: // if(!multires_level1_test()) { { bDeformGroup *defGroup = BLI_findlink(&ob->defbase, ob->actdef-1); if(defGroup) { Mesh *me= ob->data; int a; for(a=0; a<me->totvert; a++) ED_vgroup_vert_remove (ob, defGroup, a); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); } } break; case B_RV3D_LOCKED: case B_RV3D_BOXVIEW: case B_RV3D_BOXCLIP: { ScrArea *sa= CTX_wm_area(C); ARegion *ar= sa->regionbase.last; RegionView3D *rv3d; short viewlock; ar= ar->prev; rv3d= ar->regiondata; viewlock= rv3d->viewlock; if((viewlock & RV3D_LOCKED)==0) viewlock= 0; else if((viewlock & RV3D_BOXVIEW)==0) viewlock &= ~RV3D_BOXCLIP; for(; ar; ar= ar->prev) { if(ar->alignment==RGN_ALIGN_QSPLIT) { rv3d= ar->regiondata; rv3d->viewlock= viewlock; } } if(rv3d->viewlock & RV3D_BOXVIEW) view3d_boxview_copy(sa, sa->regionbase.last); ED_area_tag_redraw(sa); } break; } /* default for now */ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, ob); }