void PlaneDistortWarpImageOperation::calculateCorners(const float corners[4][2], bool normalized, int sample) { BLI_assert(sample < this->m_motion_blur_samples); const int width = this->m_pixelReader->getWidth(); const int height = this->m_pixelReader->getHeight(); float frame_corners[4][2] = { {0.0f, 0.0f}, {(float)width, 0.0f}, {(float)width, (float)height}, {0.0f, (float)height}}; MotionSample *sample_data = &this->m_samples[sample]; if (normalized) { for (int i = 0; i < 4; i++) { sample_data->frameSpaceCorners[i][0] = corners[i][0] * this->getWidth(); sample_data->frameSpaceCorners[i][1] = corners[i][1] * this->getHeight(); } } else { for (int i = 0; i < 4; i++) { sample_data->frameSpaceCorners[i][0] = corners[i][0]; sample_data->frameSpaceCorners[i][1] = corners[i][1]; } } BKE_tracking_homography_between_two_quads( sample_data->frameSpaceCorners, frame_corners, sample_data->perspectiveMatrix); }
void PlaneDistortWarpImageOperation::calculatePerspectiveMatrix() { const int width = this->m_pixelReader->getWidth(); const int height = this->m_pixelReader->getHeight(); float frame_corners[4][2] = {{0.0f, 0.0f}, {(float) width, 0.0f}, {(float) width, (float) height}, {0.0f, (float) height}}; BKE_tracking_homography_between_two_quads(this->m_frameSpaceCorners, frame_corners, this->m_perspectiveMatrix); }
void PlaneTrackWarpImageOperation::initExecution() { PlaneTrackCommonOperation::initExecution(); this->m_pixelReader = this->getInputSocketReader(0); const int width = this->m_pixelReader->getWidth(); const int height = this->m_pixelReader->getHeight(); float frame_corners[4][2] = {{0.0f, 0.0f}, {(float) width, 0.0f}, {(float) width, (float) height}, {0.0f, (float) height}}; BKE_tracking_homography_between_two_quads(this->m_frameSpaceCorners, frame_corners, this->m_perspectiveMatrix); }
static void draw_plane_marker_image(Scene *scene, MovieTrackingPlaneTrack *plane_track, MovieTrackingPlaneMarker *plane_marker) { Image *image = plane_track->image; ImBuf *ibuf; void *lock; if (image == NULL) { return; } ibuf = BKE_image_acquire_ibuf(image, NULL, &lock); if (ibuf) { unsigned char *display_buffer; void *cache_handle; if (image->flag & IMA_VIEW_AS_RENDER) { display_buffer = IMB_display_buffer_acquire(ibuf, &scene->view_settings, &scene->display_settings, &cache_handle); } else { display_buffer = IMB_display_buffer_acquire(ibuf, NULL, &scene->display_settings, &cache_handle); } if (display_buffer) { GLuint texid, last_texid; float frame_corners[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}}; float perspective_matrix[3][3]; float gl_matrix[4][4]; bool transparent = false; BKE_tracking_homography_between_two_quads(frame_corners, plane_marker->corners, perspective_matrix); homogeneous_2d_to_gl_matrix(perspective_matrix, gl_matrix); if (plane_track->image_opacity != 1.0f || ibuf->planes == 32) { transparent = true; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f(1.0, 1.0, 1.0, plane_track->image_opacity); last_texid = glaGetOneInteger(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D); glGenTextures(1, (GLuint *)&texid); glBindTexture(GL_TEXTURE_2D, texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, display_buffer); glPushMatrix(); glMultMatrixf(gl_matrix); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f); glEnd(); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, last_texid); glDisable(GL_TEXTURE_2D); if (transparent) { glDisable(GL_BLEND); } } IMB_display_buffer_release(cache_handle); } BKE_image_release_ibuf(image, ibuf, lock); }