static void do_vert_pair(GPUVertBuf *vbo, uint pos, uint *vidx, int corner, int i) { float inter[2], exter[2]; inter[0] = cosf(corner * M_PI_2 + (i * M_PI_2 / (CORNER_RESOLUTION - 1.0f))); inter[1] = sinf(corner * M_PI_2 + (i * M_PI_2 / (CORNER_RESOLUTION - 1.0f))); /* Snap point to edge */ float div = 1.0f / max_ff(fabsf(inter[0]), fabsf(inter[1])); mul_v2_v2fl(exter, inter, div); exter[0] = roundf(exter[0]); exter[1] = roundf(exter[1]); if (i == 0 || i == (CORNER_RESOLUTION - 1)) { copy_v2_v2(inter, exter); } /* Line width is 20% of the entire corner size. */ const float line_width = 0.2f; /* Keep in sync with shader */ mul_v2_fl(inter, 1.0f - line_width); mul_v2_fl(exter, 1.0f + line_width); switch (corner) { case 0: add_v2_v2(inter, (float[2]){-1.0f, -1.0f}); add_v2_v2(exter, (float[2]){-1.0f, -1.0f});
static void edit_text_cache_populate_select(void *vedata, Object *ob) { EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl; const Curve *cu = ob->data; EditFont *ef = cu->editfont; float final_mat[4][4], box[4][2]; struct GPUBatch *geom = DRW_cache_quad_get(); for (int i = 0; i < ef->selboxes_len; i++) { EditFontSelBox *sb = &ef->selboxes[i]; float selboxw; if (i + 1 != ef->selboxes_len) { if (ef->selboxes[i + 1].y == sb->y) { selboxw = ef->selboxes[i + 1].x - sb->x; } else { selboxw = sb->w; } } else { selboxw = sb->w; } /* NOTE: v2_quad_corners_to_mat4 don't need the 3rd corner. */ if (sb->rot == 0.0f) { copy_v2_fl2(box[0], sb->x, sb->y); copy_v2_fl2(box[1], sb->x + selboxw, sb->y); copy_v2_fl2(box[3], sb->x, sb->y + sb->h); } else { float mat[2][2]; angle_to_mat2(mat, sb->rot); copy_v2_fl2(box[0], sb->x, sb->y); mul_v2_v2fl(box[1], mat[0], selboxw); add_v2_v2(box[1], &sb->x); mul_v2_v2fl(box[3], mat[1], sb->h); add_v2_v2(box[3], &sb->x); } v2_quad_corners_to_mat4(box, final_mat); mul_m4_m4m4(final_mat, ob->obmat, final_mat); DRW_shgroup_call_obmat(stl->g_data->overlay_select_shgrp, geom, final_mat); } }
MINLINE float normalize_v2_v2(float r[2], const float a[2]) { float d= dot_v2v2(a, a); if(d > 1.0e-35f) { d= sqrtf(d); mul_v2_v2fl(r, a, 1.0f/d); } else { zero_v2(r); d= 0.0f; } return d; }
void clip_draw_main(const bContext *C, SpaceClip *sc, ARegion *ar) { MovieClip *clip = ED_space_clip_get_clip(sc); Scene *scene = CTX_data_scene(C); ImBuf *ibuf = NULL; int width, height; float zoomx, zoomy; ED_space_clip_get_size(sc, &width, &height); ED_space_clip_get_zoom(sc, ar, &zoomx, &zoomy); /* if no clip, nothing to do */ if (!clip) { ED_region_grid_draw(ar, zoomx, zoomy); return; } if (sc->flag & SC_SHOW_STABLE) { float smat[4][4], ismat[4][4]; ibuf = ED_space_clip_get_stable_buffer(sc, sc->loc, &sc->scale, &sc->angle); if (ibuf) { float translation[2]; float aspect = clip->tracking.camera.pixel_aspect; if (width != ibuf->x) mul_v2_v2fl(translation, sc->loc, (float)width / ibuf->x); else copy_v2_v2(translation, sc->loc); BKE_tracking_stabilization_data_to_mat4(width, height, aspect, translation, sc->scale, sc->angle, sc->stabmat); unit_m4(smat); smat[0][0] = 1.0f / width; smat[1][1] = 1.0f / height; invert_m4_m4(ismat, smat); mul_serie_m4(sc->unistabmat, smat, sc->stabmat, ismat, NULL, NULL, NULL, NULL, NULL); } } else if ((sc->flag & SC_MUTE_FOOTAGE) == 0) { ibuf = ED_space_clip_get_buffer(sc); zero_v2(sc->loc); sc->scale = 1.0f; unit_m4(sc->stabmat); unit_m4(sc->unistabmat); } if (ibuf) { draw_movieclip_buffer(C, sc, ar, ibuf, width, height, zoomx, zoomy); IMB_freeImBuf(ibuf); } else if (sc->flag & SC_MUTE_FOOTAGE) { draw_movieclip_muted(ar, width, height, zoomx, zoomy); } else { ED_region_grid_draw(ar, zoomx, zoomy); } if (width && height) { draw_stabilization_border(sc, ar, width, height, zoomx, zoomy); draw_tracking_tracks(sc, scene, ar, clip, width, height, zoomx, zoomy); draw_distortion(sc, ar, clip, width, height, zoomx, zoomy); } }
/* don't set windows active in here, is used by renderwin too */ void view3d_viewmatrix_set(Scene *scene, View3D *v3d, RegionView3D *rv3d) { if (rv3d->persp == RV3D_CAMOB) { /* obs/camera */ if (v3d->camera) { BKE_object_where_is_calc(scene, v3d->camera); obmat_to_viewmat(rv3d, v3d->camera); } else { quat_to_mat4(rv3d->viewmat, rv3d->viewquat); rv3d->viewmat[3][2] -= rv3d->dist; } } else { bool use_lock_ofs = false; /* should be moved to better initialize later on XXX */ if (rv3d->viewlock & RV3D_LOCKED) ED_view3d_lock(rv3d); quat_to_mat4(rv3d->viewmat, rv3d->viewquat); if (rv3d->persp == RV3D_PERSP) rv3d->viewmat[3][2] -= rv3d->dist; if (v3d->ob_centre) { Object *ob = v3d->ob_centre; float vec[3]; copy_v3_v3(vec, ob->obmat[3]); if (ob->type == OB_ARMATURE && v3d->ob_centre_bone[0]) { bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, v3d->ob_centre_bone); if (pchan) { copy_v3_v3(vec, pchan->pose_mat[3]); mul_m4_v3(ob->obmat, vec); } } translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]); use_lock_ofs = true; } else if (v3d->ob_centre_cursor) { float vec[3]; copy_v3_v3(vec, ED_view3d_cursor3d_get(scene, v3d)); translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]); use_lock_ofs = true; } else { translate_m4(rv3d->viewmat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]); } /* lock offset */ if (use_lock_ofs) { float persmat[4][4], persinv[4][4]; float vec[3]; /* we could calculate the real persmat/persinv here * but it would be unreliable so better to later */ mul_m4_m4m4(persmat, rv3d->winmat, rv3d->viewmat); invert_m4_m4(persinv, persmat); mul_v2_v2fl(vec, rv3d->ofs_lock, rv3d->is_persp ? rv3d->dist : 1.0f); vec[2] = 0.0f; mul_mat3_m4_v3(persinv, vec); translate_m4(rv3d->viewmat, vec[0], vec[1], vec[2]); } /* end lock offset */ } }
static void object_warp_transverts(TransVertStore *tvs, float mat_view[4][4], const float center_view[3], const float angle_, const float min, const float max) { TransVert *tv; int i; const float angle = -angle_; /* cache vars for tiny speedup */ #if 1 const float range = max - min; const float range_inv = 1.0f / range; const float min_ofs = min + (0.5f * range); #endif float dir_min[2], dir_max[2]; float imat_view[4][4]; invert_m4_m4(imat_view, mat_view); /* calculate the direction vectors outside min/max range */ { const float phi = angle * 0.5f; dir_max[0] = cosf(phi); dir_max[1] = sinf(phi); dir_min[0] = -dir_max[0]; dir_min[1] = dir_max[1]; } tv = tvs->transverts; for (i = 0; i < tvs->transverts_tot; i++, tv++) { float co[3], co_add[2]; float val, phi; /* convert objectspace->viewspace */ mul_v3_m4v3(co, mat_view, tv->loc); sub_v2_v2(co, center_view); val = co[0]; /* is overwritten later anyway */ // co[0] = 0.0f; if (val < min) { mul_v2_v2fl(co_add, dir_min, min - val); val = min; } else if (val > max) { mul_v2_v2fl(co_add, dir_max, val - max); val = max; } else { zero_v2(co_add); } /* map from x axis to (-0.5 - 0.5) */ #if 0 val = ((val - min) / (max - min)) - 0.5f; #else val = (val - min_ofs) * range_inv; #endif /* convert the x axis into a rotation */ phi = val * angle; co[0] = -sinf(phi) * co[1]; co[1] = cosf(phi) * co[1]; add_v2_v2(co, co_add); /* convert viewspace->objectspace */ add_v2_v2(co, center_view); mul_v3_m4v3(tv->loc, imat_view, co); } }