diff --git a/+Movie/awaitRenderDone.m b/+Movie/awaitRenderDone.m new file mode 100644 index 0000000000000000000000000000000000000000..92797b2a27301606fa9b6f5dc9af268997ce2eec --- /dev/null +++ b/+Movie/awaitRenderDone.m @@ -0,0 +1,15 @@ +function bCompleted = awaitRenderDone(timeout, uiserver_info) + bCompleted=false; + + elapsed = 0; + chk_timer = tic(); + while ( ~bCompleted && (timeout <= 0 || elapsed <= timeout) ) + bCompleted = webread([uiserver_info.host '/drawComplete'], uiserver_info.opts); + if ( bCompleted ) + return; + end + + pause(0.5); + elapsed = toc(chk_timer); + end +end diff --git a/+Movie/render_rot_movie.m b/+Movie/render_rot_movie.m new file mode 100644 index 0000000000000000000000000000000000000000..0aee77d5bc3816561eacd8cd5062165d1ece7523 --- /dev/null +++ b/+Movie/render_rot_movie.m @@ -0,0 +1,120 @@ +function render_rot_movie(movieName, lAngle, rAngle) + %% Load initial view_params + web_opts = weboptions('Timeout',60); + uiserver_info = struct('host','http://localhost:4444', ... + 'opts',web_opts); + + view_params = pull_params(uiserver_info); + + %% Setup movie framce-cap dir + dataDir = 'Data'; + frameDir = fullfile(dataDir, [movieName '_frames']); + if ( ~exist(frameDir, 'dir') ) + mkdir(frameDir); + end + + %% Setup rotation matrices + nsteps = 45; + stepAngle = 2*(rAngle - lAngle) / nsteps; + + Rs = [cosd(stepAngle) 0 sind(stepAngle) 0; + 0 1 0 0; + -sind(stepAngle) 0 cosd(stepAngle) 0 + 0 0 0 1]; + + Rinit = [cosd(lAngle) 0 sind(lAngle) 0; + 0 1 0 0; + -sind(lAngle) 0 cosd(lAngle) 0 + 0 0 0 1]; + + W = reshape(view_params.worldRot, 4,4); + Wi = Rinit * W; + + %% Prep rendering + Movie.movie_enable_uitoolbars(false, uiserver_info); + push_params(Wi, view_params, uiserver_info); + pause(0.5); + + %% Try to wait for last initial-render to complete + if ( ~Movie.awaitRenderDone(300, uiserver_info) ) + error('Full rendering timed-out after 5 minutes!'); + end + + pause(0.5); + + for i=1:nsteps + if ( i > 1 ) + Wi = Rs * Wi; + end + + frameFile = fullfile(frameDir, [movieName '_t' num2str(i, '%04d') '.png']); + + push_params(Wi, view_params, uiserver_info); + %% Try to wait for last initial-render to complete + if ( ~Movie.awaitRenderDone(300, uiserver_info) ) + error('Full rendering timed-out after 5 minutes!'); + end + + pause(0.5); + + %% Write frame to directory + imFrame = webread([uiserver_info.host '/screenCap'], web_opts); + + frameSize = [size(imFrame,1) size(imFrame,2)]; + + framePad = mod(frameSize,2); + imPad = zeros([frameSize + framePad, 3], 'like',imFrame); + + imPad(1:frameSize(1),1:frameSize(2),:) = imFrame; + + imwrite(imPad, frameFile, 'png'); + end + + for i=1:nsteps + Wi = (Rs') * Wi; + + frameFile = fullfile(frameDir, [movieName '_t' num2str(i+nsteps, '%04d') '.png']); + + push_params(Wi, view_params, uiserver_info); + %% Try to wait for last initial-render to complete + if ( ~Movie.awaitRenderDone(300, uiserver_info) ) + error('Full rendering timed-out after 5 minutes!'); + end + + pause(0.5); + + %% Write frame to directory + imFrame = webread([uiserver_info.host '/screenCap'], web_opts); + + frameSize = [size(imFrame,1) size(imFrame,2)]; + + framePad = mod(frameSize,2); + imPad = zeros([frameSize + framePad, 3], 'like',imFrame); + + imPad(1:frameSize(1),1:frameSize(2),:) = imFrame; + + imwrite(imPad, frameFile, 'png'); + end + + fps = 30; + resx = 1920; + inpattern = fullfile(frameDir,[movieName '_t%04d.png']); + movieFile = fullfile('update_movies', [movieName '.mp4']); + + ffmpegStr = sprintf('ffmpeg -y -i %s -vf scale=%d:-1 -preset veryslow -crf 28 -pix_fmt yuv420p -r %d %s', inpattern, resx, fps, movieFile); + status = system(ffmpegStr); + +end + +function push_params(W, view_params, uiserver_info) + uiserver_info.opts.MediaType = 'application/json'; + + view_params.worldRot = W(:); + webwrite([uiserver_info.host '/view'], view_params, uiserver_info.opts); +end + +function view_params = pull_params(uiserver_info) + uiserver_info.opts.MediaType = 'application/json'; + + view_params = webread([uiserver_info.host '/view'], uiserver_info.opts); +end diff --git a/+Movie/rendermovie.m b/+Movie/rendermovie.m index b6de1a6868beb998832581cfc44513d7468e5cbc..c9149c78bcba34cfb1786c7bc12bd84a93a17fd7 100644 --- a/+Movie/rendermovie.m +++ b/+Movie/rendermovie.m @@ -21,7 +21,7 @@ function rendermovie(movieName, startFrame, endFrame) pause(0.5); %% Try to wait for last initial-render to complete - if ( ~awaitRenderDone(300, uiserver_info) ) + if ( ~Movie.awaitRenderDone(300, uiserver_info) ) error('Full rendering timed-out after 5 minutes!'); end @@ -83,7 +83,7 @@ function rendermovie(movieName, startFrame, endFrame) webwrite([uiserver_info.host '/time/' num2str(time)] ,''); %% Wait for complete volume render - if ( ~awaitRenderDone(300, uiserver_info) ) + if ( ~Movie.awaitRenderDone(300, uiserver_info) ) error('Full rendering timed-out after 5 minutes!'); end @@ -120,19 +120,3 @@ function rendermovie(movieName, startFrame, endFrame) % rmdir(frameDir,'s'); % end end - -function bCompleted = awaitRenderDone(timeout, uiserver_info) - bCompleted=false; - - elapsed = 0; - chk_timer = tic(); - while ( ~bCompleted && (timeout <= 0 || elapsed <= timeout) ) - bCompleted = webread([uiserver_info.host '/drawComplete'], uiserver_info.opts); - if ( bCompleted ) - return; - end - - pause(0.5); - elapsed = toc(chk_timer); - end -end diff --git a/+Stats/make_movie_table.m b/+Stats/make_movie_table.m index 2d8d2934956ed56d235e70eeddba06b3c4a7f8de..c1cbca233b28c329380ccc18bf9bcc31ac5666b0 100644 --- a/+Stats/make_movie_table.m +++ b/+Stats/make_movie_table.m @@ -8,7 +8,7 @@ exp_types = vertcat(exp_types{:}); tsmp = arrayfun(@(x)(median(diff(x.tsmp))), ecto_size_stats); -bExcludeMotion = (tsmp >= 7.0); +bExcludeMotion = ((tsmp >= 7.0) | (tsmp <= 5.0)); exclMotSrt = repmat({'A'}, length(bExcludeMotion),1); exclMotSrt(bExcludeMotion) = {'B'}; @@ -21,7 +21,7 @@ chkrows = vertcat(chkrows{:}); [~,srtidx] = sortrows(chkrows); fid = fopen('sup_table_info.csv','wt'); -fprintf(fid, 'Dataset,Treatment,dt (sec),First Frame Vesicles (Mesoderm),Motion Statistics,First Frame Vesicles (Ectoderm),Total Vesicles (Mesoderm),Total Vesicles (Ectoderm)\n'); +fprintf(fid, 'Dataset,Treatment,dt (sec),Motion Statistics,First Frame Vesicles (Mesoderm),First Frame Vesicles (Ectoderm),Total Vesicles (Mesoderm),Total Vesicles (Ectoderm)\n'); for i=1:length(srtidx) idx = srtidx(i); diff --git a/make_movie_script.m b/make_movie_script.m new file mode 100644 index 0000000000000000000000000000000000000000..dc597fd3d900734c68fb8c72bf42bbf324111f32 --- /dev/null +++ b/make_movie_script.m @@ -0,0 +1,11 @@ +%% Set the current movie name +movieName = '2016-06-29_tl1p0_bb94'; + +%% Save out movie-making parameters +save_movie_params(movieName); + +%% Set the parameters (and make sure everything looks good) +set_movie_params(movieName); + +%% Start the movie render (usually up to 200 frames) +rendermovie(movieName, 1,170);