def __toggleUILock(self, state): gSettings.setValue('lockui', '1' if state else '0') features = QDockWidget.NoDockWidgetFeatures if state else QDockWidget.AllDockWidgetFeatures for dockWidget in self.findChildren(QDockWidget): # only affect docked widgets if not dockWidget.isFloating(): dockWidget.setFeatures(features)
def setPreviewRes(self, widthOverride, heightOverride, scale): if widthOverride is not None: x = self.parent().width() - self.width() y = self.parent().height() - self.height() self.parent().setGeometry(self.parent().x(), self.parent().y(), widthOverride + x, heightOverride + y) self._previewRes = widthOverride, heightOverride, scale gSettings.setValue('GLViewScale', scale) self.__onResize()
def setOverlayColor(self, color): """ :type color: QColor """ gSettings.setValue('overlayColor', color.rgba()) self.changed.emit()
def setOverlayIndex(self, index): """ :type index: int """ gSettings.setValue('overlayIndex', index) self.changed.emit()
def __openProject(self, path): gSettings.setValue('currentproject', path) self.__sceneList.projectOpened() self.__shotsManager.projectOpened() self._timer.projectOpened()
def __record(self): diag = QDialog() fId = gSettings.value('RecordFPS', 2) rId = gSettings.value('RecordResolution', 3) layout = QGridLayout() diag.setLayout(layout) layout.addWidget(QLabel('FPS: '), 0, 0) fps = QComboBox() fps.addItems(['12', '24', '30', '48', '60', '120']) fps.setCurrentIndex(fId) layout.addWidget(fps, 0, 1) layout.addWidget(QLabel('Vertical resolution: '), 1, 0) resolution = QComboBox() resolution.addItems(['144', '288', '360', '720', '1080', '2160']) resolution.setCurrentIndex(rId) layout.addWidget(resolution, 1, 1) ok = QPushButton('Ok') ok.clicked.connect(diag.accept) cancel = QPushButton('Cancel') cancel.clicked.connect(diag.reject) layout.addWidget(ok, 2, 0) layout.addWidget(cancel, 2, 1) diag.exec_() if diag.result() != QDialog.Accepted: return gSettings.setValue('RecordFPS', fps.currentIndex()) gSettings.setValue('RecordResolution', resolution.currentIndex()) FPS = int(fps.currentText()) HEIGHT = int(resolution.currentText()) WIDTH = (HEIGHT * 16) / 9 FMT = 'jpg' data = (ctypes.c_ubyte * (WIDTH * HEIGHT * 3))() # alloc buffer once flooredStart = self._timer.secondsToBeats(int(self._timer.beatsToSeconds(self._timer.start) * FPS) / float(FPS)) duration = self._timer.beatsToSeconds(self._timer.end - flooredStart) if not fileutil.exists('capture'): os.makedirs('capture') progress = QProgressDialog(self) progress.setMaximum(int(duration * FPS)) prevFrame = 0 for frame in xrange(int(duration * FPS)): deltaTime = (frame - prevFrame) / float(FPS) prevFrame = frame progress.setValue(frame) QApplication.processEvents() if progress.wasCanceled(): break beats = flooredStart + self._timer.secondsToBeats(frame / float(FPS)) shot = self.__shotsManager.shotAtTime(beats) if shot is None: continue sceneFile = os.path.join(ScenesPath(), shot.sceneName + SCENE_EXT) scene = Scene.getScene(sceneFile) scene.setSize(WIDTH, HEIGHT) uniforms = self.__shotsManager.evaluate(beats) textureUniforms = self.__shotsManager.additionalTextures(beats) self.__sceneView._cameraInput.setData(*(uniforms['uOrigin'] + uniforms['uAngles'])) # feed animation into camera so animationprocessor can read it again cameraData = self.__sceneView._cameraInput.data() modifier = os.path.join(ProjectDir(), 'animationprocessor.py') if fileutil.exists(modifier): execfile(modifier, globals(), locals()) for name in self.__sceneView._textures: uniforms[name] = self.__sceneView._textures[name]._id scene.drawToScreen(self._timer.beatsToSeconds(beats), beats, uniforms, (0, 0, WIDTH, HEIGHT), textureUniforms) scene.colorBuffers[-1][0].use() from OpenGL.GL import glGetTexImage, GL_TEXTURE_2D, GL_RGB, GL_UNSIGNED_BYTE glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, data) QImage(data, WIDTH, HEIGHT, QImage.Format_RGB888).mirrored(False, True).save('capture/dump_%s_%05d.%s' % (FPS, int(self._timer.beatsToSeconds(self._timer.start) * FPS) + frame, FMT)) progress.close() if not fileutil.exists('convertcapture'): os.makedirs('convertcapture') with fileutil.edit('convertcapture/convert.bat') as fh: start = '' start2 = '' if int(self._timer.start * FPS) > 0: start = '-start_number {} '.format(int(self._timer.beatsToSeconds(self._timer.start) * FPS)) start2 = '-vframes {} '.format(int(self._timer.beatsToSeconds(self._timer.end - self._timer.start) * FPS)) fh.write('cd "../capture"\n"../convertcapture/ffmpeg.exe" -framerate {} {}-i dump_{}_%%05d.{} {}-c:v libx264 -r {} -pix_fmt yuv420p "../convertcapture/output.mp4"'.format(FPS, start, FPS, FMT, start2, FPS)) with fileutil.edit('convertcapture/convertGif.bat') as fh: start = '' start2 = '' if int(self._timer.start * FPS) > 0: start = '-start_number {} '.format(int(self._timer.beatsToSeconds(self._timer.start) * FPS)) start2 = '-vframes {} '.format(int(self._timer.beatsToSeconds(self._timer.end - self._timer.start) * FPS)) fh.write('cd "../capture"\n"../convertcapture/ffmpeg.exe" -framerate {} {}-i dump_{}_%%05d.{} {}-r {} "../convertcapture/output.gif"'.format(FPS, start, FPS, FMT, start2, FPS)) sound = self.timeSlider.soundtrackPath() if not sound: return with fileutil.edit('convertcapture/merge.bat') as fh: startSeconds = self._timer.beatsToSeconds(self._timer.start) fh.write('ffmpeg -i output.mp4 -itsoffset {} -i "{}" -vcodec copy -shortest merged.mp4'.format(-startSeconds, sound))
def __record(self): diag = QDialog() fId = gSettings.value('RecordFPS', 2) rId = gSettings.value('RecordResolution', 3) layout = QGridLayout() diag.setLayout(layout) layout.addWidget(QLabel('FPS: '), 0, 0) fps = QComboBox() fps.addItems(['12', '24', '30', '48', '60', '120']) fps.setCurrentIndex(fId) layout.addWidget(fps, 0, 1) layout.addWidget(QLabel('Vertical resolution: '), 1, 0) resolution = QComboBox() resolution.addItems(['144', '288', '360', '720', '1080', '2160']) resolution.setCurrentIndex(rId) layout.addWidget(resolution, 1, 1) ok = QPushButton('Ok') ok.clicked.connect(diag.accept) cancel = QPushButton('Cancel') cancel.clicked.connect(diag.reject) layout.addWidget(ok, 2, 0) layout.addWidget(cancel, 2, 1) diag.exec_() if diag.result() != QDialog.Accepted: return gSettings.setValue('RecordFPS', fps.currentIndex()) gSettings.setValue('RecordResolution', resolution.currentIndex()) FPS = int(fps.currentText()) HEIGHT = int(resolution.currentText()) WIDTH = (HEIGHT * 16) / 9 FMT = 'jpg' data = (ctypes.c_ubyte * (WIDTH * HEIGHT * 3))() # alloc buffer once flooredStart = self._timer.secondsToBeats( int(self._timer.beatsToSeconds(self._timer.start) * FPS) / float(FPS)) duration = self._timer.beatsToSeconds(self._timer.end - flooredStart) captureDir = currentProjectDirectory().join('capture') captureDir.ensureExists(isFolder=True) progress = QProgressDialog(self) progress.setMaximum(int(duration * FPS)) prevFrame = 0 for frame in range(int(duration * FPS)): deltaTime = (frame - prevFrame) / float(FPS) prevFrame = frame progress.setValue(frame) QApplication.processEvents() if progress.wasCanceled(): break beats = flooredStart + self._timer.secondsToBeats( frame / float(FPS)) shot = self.__shotsManager.shotAtTime(beats) if shot is None: continue sceneFile = currentScenesDirectory().join( shot.sceneName).ensureExt(SCENE_EXT) scene = Scene.getScene(sceneFile) scene.setSize(WIDTH, HEIGHT) uniforms = self.__shotsManager.evaluate(beats) textureUniforms = self.__shotsManager.additionalTextures(beats) self.__sceneView._cameraInput.setData( *(uniforms['uOrigin'] + uniforms['uAngles']) ) # feed animation into camera so animationprocessor can read it again cameraData = self.__sceneView._cameraInput.data() modifier = currentProjectDirectory().join('animationprocessor.py') if modifier.exists(): execfile(str(modifier), globals(), locals()) for name in self.__sceneView._textures: uniforms[name] = self.__sceneView._textures[name]._id scene.drawToScreen(self._timer.beatsToSeconds(beats), beats, uniforms, (0, 0, WIDTH, HEIGHT), textureUniforms) scene.colorBuffers[-1][0].use() from OpenGL.GL import glGetTexImage, GL_TEXTURE_2D, GL_RGB, GL_UNSIGNED_BYTE glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, data) captureDir = currentProjectDirectory().join('capture') QImage(data, WIDTH, HEIGHT, QImage.Format_RGB888).mirrored( False, True ).save( captureDir.join( 'dump_%s_%05d.%s' % (FPS, int(self._timer.beatsToSeconds(self._timer.start) * FPS) + frame, FMT))) progress.close() convertCaptureDir = currentProjectDirectory().join('convertcapture') convertCaptureDir.ensureExists(isFolder=True) with convertCaptureDir.join('convert.bat').edit() as fh: start = '' start2 = '' if int(self._timer.start * FPS) > 0: start = '-start_number {} '.format( int(self._timer.beatsToSeconds(self._timer.start) * FPS)) start2 = '-vframes {} '.format( int( self._timer.beatsToSeconds(self._timer.end - self._timer.start) * FPS)) fh.write( 'cd "../capture"\n"{}" -framerate {} {}-i dump_{}_%%05d.{} {}-c:v libx264 -r {} -pix_fmt yuv420p "../convertcapture/output.mp4"' .format(FFMPEG_PATH, FPS, start, FPS, FMT, start2, FPS)) with convertCaptureDir.join('convertGif.bat').edit() as fh: start = '' start2 = '' iln = '' if int(self._timer.start * FPS) > 0: start = '-start_number {} '.format( int(self._timer.beatsToSeconds(self._timer.start) * FPS)) start2 = '-vframes {} '.format( int( self._timer.beatsToSeconds(self._timer.end - self._timer.start) * FPS)) iln = '-t {:03f} '.format( self._timer.beatsToSeconds(self._timer.end - self._timer.start)) fh.write( 'REM File format is actually %5d but in a .bat file we need to escape % or something, so you can\'t copy paste this into a cmd prompt without fixing up the %%05d to be %5d.\n' ) fh.write( 'cd "../capture"\n"{}" -framerate {} {}{}-i dump_{}_%%05d.{} -vf "fps={},scale={}:-1:flags=lanczos,palettegen" palette.png\n' .format(FFMPEG_PATH, FPS, start, iln, FPS, FMT, FPS, HEIGHT)) fh.write( '"{}" -framerate {} {}-i dump_{}_%%05d.{} -i "palette.png" -filter_complex "fps=12,scale=360:-1:flags=lanczos[x];[x][1:v]paletteuse" {}-r {} "../convertcapture/output.gif"' .format(FFMPEG_PATH, FPS, start, FPS, FMT, start2, FPS)) sound = self.timeSlider.soundtrackPath() if not sound: return with convertCaptureDir.join('merge.bat').edit() as fh: startSeconds = self._timer.beatsToSeconds(self._timer.start) fh.write( '{} -i output.mp4 -itsoffset {} -i "{}" -vcodec copy -shortest merged.mp4' .format(FFMPEG_PATH, -startSeconds, sound))
def setMuteState(state): gSettings.setValue('mute', str(bool(state)))
def saveState(self): gSettings.setValue('TimerStartTime', self.__start) gSettings.setValue('TimerEndTime', self.__end) gSettings.setValue('TimerTime', self.__time) project = ProjectFile() if not project or not fileutil.exists(project): # legacy project or no project open gSettings.setValue('TimerMinTime', self.__minTime) gSettings.setValue('TimerMaxTime', self.__maxTime) gSettings.setValue('TimerBPS', self.__BPS) return root = cElementTree.Element('Project') root.attrib['TimerMinTime'] = str(self.__minTime) root.attrib['TimerMaxTime'] = str(self.__maxTime) root.attrib['TimerBPS'] = str(self.__BPS) with fileutil.edit(project, 'w') as fh: fh.write(toPrettyXml(root))