def createSceneGraph(self): sceneGraph = scenegraph.Node() self.worldScene = self.createWorldScene() self.worldScene.setVisibleLayers(self.layerToggleGroup.getVisibleLayers()) clearNode = scenegraph.ClearNode() skyNode = sky.SkyNode() self.loadableChunksNode = loadablechunks.LoadableChunksNode(self.dimension) self.matrixNode = scenegraph.MatrixNode() self._updateMatrices() self.overlayNode = scenegraph.Node() self.matrixNode.addChild(self.loadableChunksNode) self.matrixNode.addChild(self.worldScene) self.matrixNode.addChild(self.overlayNode) sceneGraph.addChild(clearNode) sceneGraph.addChild(skyNode) sceneGraph.addChild(self.matrixNode) sceneGraph.addChild(self.compassOrthoNode) if self.cursorNode: self.matrixNode.addChild(self.cursorNode) return sceneGraph
def __init__(self, editorSession, *args, **kwargs): """ :type editorSession: EditorSession """ super(SelectionTool, self).__init__(editorSession, *args, **kwargs) toolWidget = QtGui.QWidget() editorSession.selectionChanged.connect(self.selectionDidChange) self.toolWidget = toolWidget self.coordInput = SelectionCoordinateWidget() self.coordInput.boxChanged.connect(self.coordInputChanged) self.shapeInput = ShapeWidget() self.shapeInput.shapeChanged.connect(self.shapeDidChange) self.toolWidget.setLayout( Column(self.coordInput, self.shapeInput, None)) self.cursorNode = SelectionCursor() self.overlayNode = scenegraph.Node() self.faceHoverNode = SelectionFaceNode() self.selectionNode = SelectionScene() self.overlayNode.addChild(self.selectionNode) self.overlayNode.addChild(self.faceHoverNode) self.boxHandleNode = BoxHandle() self.boxHandleNode.boundsChanged.connect(self.boxHandleResized) self.boxHandleNode.boundsChangedDone.connect(self.boxHandleResizedDone) self.overlayNode.addChild(self.boxHandleNode) self.newSelectionNode = None editorSession.dimensionChanged.connect(self.dimensionDidChange)
def __init__(self, dimension, textureAtlas=None, geometryCache=None, sharedGLWidget=None): """ :param dimension: :type dimension: WorldEditorDimension :param textureAtlas: :type textureAtlas: TextureAtlas :param geometryCache: :type geometryCache: GeometryCache :param sharedGLWidget: :type sharedGLWidget: QGLWidget :return: :rtype: """ QGLWidget.__init__(self, shareWidget=sharedGLWidget) self.setSizePolicy(QtGui.QSizePolicy.Policy.Expanding, QtGui.QSizePolicy.Policy.Expanding) self.setFocusPolicy(Qt.ClickFocus) self.layerToggleGroup = LayerToggleGroup() self.layerToggleGroup.layerToggled.connect(self.setLayerVisible) self.dimension = None self.worldScene = None self.loadableChunksNode = None self.textureAtlas = None self.mouseRay = Ray(Vector(0, 1, 0), Vector(0, -1, 0)) self.setMouseTracking(True) self.lastAutoUpdate = time.time() self.autoUpdateInterval = 0.5 # frequency of screen redraws in response to loaded chunks self.compassNode = self.createCompass() self.compassOrthoNode = scenegraph.OrthoNode((1, float(self.height()) / self.width())) self.compassOrthoNode.addChild(self.compassNode) self.viewActions = [] self.pressedKeys = set() self.setTextureAtlas(textureAtlas) if geometryCache is None and sharedGLWidget is not None: geometryCache = sharedGLWidget.geometryCache if geometryCache is None: geometryCache = GeometryCache() self.geometryCache = geometryCache self.matrixNode = None self.overlayNode = scenegraph.Node() self.sceneGraph = None self.renderGraph = None self.frameSamples = deque(maxlen=500) self.frameSamples.append(time.time()) self.cursorNode = None self.setDimension(dimension)
def __init__(self, editorSession, *args, **kwargs): super(MoveTool, self).__init__(editorSession, *args, **kwargs) self.overlayNode = scenegraph.Node() self.loader = None self.dragStartFace = None self.dragStartPoint = None self.pendingImports = [] self.pendingImportNodes = {} self.toolWidget = QtGui.QWidget() self.importsListWidget = QtGui.QListView() self.importsListModel = QtGui.QStandardItemModel() self.importsListWidget.setModel(self.importsListModel) self.importsListWidget.clicked.connect(self.listClicked) self.importsListWidget.doubleClicked.connect(self.listDoubleClicked) self.pointInput = CoordinateWidget() self.pointInput.pointChanged.connect(self.pointInputChanged) confirmButton = QtGui.QPushButton( "Confirm") # xxxx should be in worldview confirmButton.clicked.connect(self.confirmImport) self.toolWidget.setLayout( Column(self.importsListWidget, self.pointInput, confirmButton, None))
def __init__(self, editorSession, *args, **kwargs): """ :type editorSession: EditorSession """ super(ChunkTool, self).__init__(editorSession, *args, **kwargs) self.toolWidget = load_ui("editortools/edit_chunk.ui") self.toolWidget.tabWidget.currentChanged.connect(self.tabDidChange) self.toolWidget.terrainPopulatedInput.toggled.connect( self.terrainPopulatedDidChange) self.toolWidget.lightPopulatedInput.toggled.connect( self.lightPopulatedDidChange) self.toolWidget.inhabitedTimeInput.valueChanged.connect( self.inhabitedTimeDidChange) self.toolWidget.updateTimeInput.valueChanged.connect( self.updateTimeDidChange) self.toolWidget.cxSpinBox.valueChanged.connect( self.chunkPositionDidChange) self.toolWidget.czSpinBox.valueChanged.connect( self.chunkPositionDidChange) self.currentChunk = None self.selectionNode = None self.overlayNode = scenegraph.Node() self.updateChunkWidget()
def __init__(self, editorSession, *args, **kwargs): """ :type editorSession: EditorSession """ super(SelectionTool, self).__init__(editorSession, *args, **kwargs) toolWidget = QtGui.QWidget() editorSession.selectionChanged.connect(self.selectionDidChange) self.toolWidget = toolWidget self.coordInput = SelectionCoordinateWidget() self.coordInput.boxChanged.connect(self.coordInputChanged) self.shapeInput = ShapeWidget() self.shapeInput.shapeChanged.connect(self.shapeDidChange) self.deselectButton = QtGui.QPushButton(self.tr("Deselect")) self.deselectButton.clicked.connect(self.deselect) self.deleteSelectionButton = QtGui.QPushButton(self.tr("Delete")) self.deleteSelectionButton.clicked.connect(self.deleteSelection) self.deleteBlocksButton = QtGui.QPushButton(self.tr("Delete Blocks")) self.deleteBlocksButton.clicked.connect(self.deleteBlocks) self.deleteEntitiesButton = QtGui.QPushButton(self.tr("Delete Entities")) self.deleteEntitiesButton.clicked.connect(self.deleteEntities) self.fillButton = QtGui.QPushButton(self.tr("Fill")) self.fillButton.clicked.connect(self.fill) self.replaceButton = QtGui.QPushButton(self.tr("Replace")) self.replaceButton.clicked.connect(self.replace) self.toolWidget.setLayout(Column(self.coordInput, self.shapeInput, self.deselectButton, self.deleteSelectionButton, self.deleteBlocksButton, self.deleteEntitiesButton, self.fillButton, self.replaceButton, None)) self.cursorNode = SelectionCursor() self.overlayNode = scenegraph.Node() self.faceHoverNode = SelectionFaceNode() self.selectionNode = SelectionScene() self.selectionNode.dimension = editorSession.currentDimension # xxx dimensionDidChange self.overlayNode.addChild(self.selectionNode) self.overlayNode.addChild(self.faceHoverNode) self.boxHandleNode = BoxHandle() self.boxHandleNode.boundsChanged.connect(self.boxHandleResized) self.boxHandleNode.boundsChangedDone.connect(self.boxHandleResizedDone) self.overlayNode.addChild(self.boxHandleNode) self.newSelectionNode = None
def createSceneGraph(self): sceneGraph = scenegraph.Node() self.worldScene = self.createWorldScene() clearNode = scenegraph.ClearNode() skyNode = sky.SkyNode() self.loadableChunksNode = loadablechunks.LoadableChunksNode( self.dimension) self.matrixNode.addChild(self.loadableChunksNode) self.matrixNode.addChild(self.worldScene) self.matrixNode.addChild(self.overlayNode) sceneGraph.addChild(clearNode) sceneGraph.addChild(skyNode) sceneGraph.addChild(self.matrixNode) sceneGraph.addChild(self.compassOrthoNode) return sceneGraph
def updateNodePreview(self): bounds = self.previewBounds if self.currentGenerator is None: return if bounds is not None and bounds.volume > 0: try: node = self.currentGenerator.getPreviewNode(bounds) except Exception: log.exception( "Error while getting scene nodes from generator:") else: if node is not None: self.clearNode() if isinstance(node, list): nodes = node node = scenegraph.Node() for c in nodes: node.addChild(c) self.overlayNode.addChild(node) self.previewNode = node
def createToolWidget(self): toolWidget = QtGui.QWidget() self.toolWidget = toolWidget column = [] self.generatorTypes = [TreeGen()] self.currentType = self.generatorTypes[0] self.generatorTypeInput = QtGui.QComboBox() for gt in self.generatorTypes: self.generatorTypeInput.addItem(gt.displayName, gt) self.generatorTypeInput.currentIndexChanged.connect( self.generatorTypeChanged) self.optionsHolder = QtGui.QStackedWidget() self.optionsHolder.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) column.append(self.generatorTypeInput) column.append(self.optionsHolder) self.toolWidget.setLayout(Column(*column)) self.overlayNode = scenegraph.Node() self.sceneHolderNode = scenegraph.TranslateNode() self.overlayNode.addChild(self.sceneHolderNode) self.boxHandleNode = BoxHandle() self.boxHandleNode.boundsChanged.connect(self.boundsDidChange) self.boxHandleNode.boundsChangedDone.connect(self.boundsDidChangeDone) self.overlayNode.addChild(self.boxHandleNode) self.worldScene = None self.schematicBounds = None
def __init__(self, filename, versionInfo, readonly=False, progressCallback=None): progressMax = 7 # fixme if progressCallback is None: def progress(status): pass else: def progress(status): progressCallback(progress.progressCount, progressMax, status) progress.progressCount += 1 progress.progressCount = 0 QtCore.QObject.__init__(self) self.undoStack = MCEUndoStack() self.filename = filename self.dockWidgets = [] self.undoBlock = None self.currentTool = None self.dirty = False self.copiedSchematic = None """:type : WorldEditor""" self.versionInfo = versionInfo # --- Open world editor --- try: progress("Creating WorldEditor...") self.worldEditor = WorldEditor(filename, readonly=readonly) except UndoFolderExists: msgBox = QtGui.QMessageBox() msgBox.setIcon(QtGui.QMessageBox.Warning) msgBox.setWindowTitle(self.tr("MCEdit tech demo")) msgBox.setText( self.tr("This world was not properly closed by MCEdit.")) msgBox.setInformativeText( self. tr("MCEdit may have crashed. An undo history was found for this world. You may try to resume editing " "with the saved undo history, or start over with the current state of the world." )) resumeBtn = msgBox.addButton("Resume Editing", QtGui.QMessageBox.ApplyRole) msgBox.addButton("Discard History", QtGui.QMessageBox.DestructiveRole) # msgBox.exec_() # clicked = msgBox.clickedButton() clicked = None # xxxxx resume = clicked is resumeBtn try: self.worldEditor = WorldEditor(filename, readonly=readonly, resume=resume) except NotImplementedError: NotImplementedYet() raise IOError("Uh-oh") self.worldEditor.requireRevisions() self.currentDimension = None progress("Creating menus...") # --- Menus --- self.menus = [] # - Edit - self.menuEdit = QtGui.QMenu(self.tr("Edit")) self.menuEdit.setObjectName("menuEdit") self.actionCut = QtGui.QAction(self.tr("Cut"), self, triggered=self.cut, enabled=False) self.actionCut.setShortcut(QtGui.QKeySequence.Cut) self.actionCut.setObjectName("actionCut") self.actionCopy = QtGui.QAction(self.tr("Copy"), self, triggered=self.copy, enabled=False) self.actionCopy.setShortcut(QtGui.QKeySequence.Copy) self.actionCopy.setObjectName("actionCopy") self.actionPaste = QtGui.QAction(self.tr("Paste"), self, triggered=self.paste, enabled=False) self.actionPaste.setShortcut(QtGui.QKeySequence.Paste) self.actionPaste.setObjectName("actionPaste") self.actionPaste_Blocks = QtGui.QAction(self.tr("Paste Blocks"), self, triggered=self.pasteBlocks, enabled=False) self.actionPaste_Blocks.setShortcut(QtGui.QKeySequence("Ctrl+Shift+V")) self.actionPaste_Blocks.setObjectName("actionPaste_Blocks") self.actionPaste_Entities = QtGui.QAction(self.tr("Paste Entities"), self, triggered=self.pasteEntities, enabled=False) self.actionPaste_Entities.setShortcut(QtGui.QKeySequence("Ctrl+Alt+V")) self.actionPaste_Entities.setObjectName("actionPaste_Entities") self.actionClear = QtGui.QAction(self.tr("Delete"), self, triggered=self.deleteSelection, enabled=False) self.actionClear.setShortcut(QtGui.QKeySequence.Delete) self.actionClear.setObjectName("actionClear") self.actionDeleteBlocks = QtGui.QAction(self.tr("Delete Blocks"), self, triggered=self.deleteBlocks, enabled=False) self.actionDeleteBlocks.setShortcut(QtGui.QKeySequence("Shift+Del")) self.actionDeleteBlocks.setObjectName("actionDeleteBlocks") self.actionDeleteEntities = QtGui.QAction( self.tr("Delete Entities"), self, triggered=self.deleteEntities, enabled=False) self.actionDeleteEntities.setShortcut( QtGui.QKeySequence("Shift+Alt+Del")) self.actionDeleteEntities.setObjectName("actionDeleteEntities") self.actionFill = QtGui.QAction(self.tr("Fill"), self, triggered=self.fill, enabled=False) self.actionFill.setShortcut(QtGui.QKeySequence("Shift+Ctrl+F")) self.actionFill.setObjectName("actionFill") self.actionFindReplace = QtGui.QAction(self.tr("Find/Replace"), self, triggered=self.findReplace, enabled=True) self.actionFindReplace.setShortcut(QtGui.QKeySequence.Find) self.actionFindReplace.setObjectName("actionFindReplace") undoAction = self.undoStack.createUndoAction(self.menuEdit) undoAction.setShortcut(QtGui.QKeySequence.Undo) redoAction = self.undoStack.createRedoAction(self.menuEdit) redoAction.setShortcut(QtGui.QKeySequence.Redo) self.menuEdit.addAction(undoAction) self.menuEdit.addAction(redoAction) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionCut) self.menuEdit.addAction(self.actionCopy) self.menuEdit.addAction(self.actionPaste) self.menuEdit.addAction(self.actionPaste_Blocks) self.menuEdit.addAction(self.actionPaste_Entities) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionClear) self.menuEdit.addAction(self.actionDeleteBlocks) self.menuEdit.addAction(self.actionDeleteEntities) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionFill) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionFindReplace) self.menus.append(self.menuEdit) # - Select - self.menuSelect = QtGui.QMenu(self.tr("Select")) self.actionSelectAll = QtGui.QAction(self.tr("Select All"), self, triggered=self.selectAll) self.actionSelectAll.setShortcut(QtGui.QKeySequence.SelectAll) self.menuSelect.addAction(self.actionSelectAll) self.actionDeselect = QtGui.QAction(self.tr("Deselect"), self, triggered=self.deselect) self.actionDeselect.setShortcut(QtGui.QKeySequence("Ctrl+D")) self.menuSelect.addAction(self.actionDeselect) self.menus.append(self.menuSelect) # - Import/Export - self.menuImportExport = QtGui.QMenu(self.tr("Import/Export")) self.actionExport = QtGui.QAction(self.tr("Export"), self, triggered=self.export) self.actionExport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+E")) self.menuImportExport.addAction(self.actionExport) self.actionImport = QtGui.QAction(self.tr("Import"), self, triggered=self.import_) self.actionImport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+D")) self.menuImportExport.addAction(self.actionImport) self.actionImport = QtGui.QAction( self.tr("Show Exports Library"), self, triggered=QtGui.qApp.libraryDockWidget.toggleViewAction().trigger) self.actionImport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+L")) self.menuImportExport.addAction(self.actionImport) self.menus.append(self.menuImportExport) # --- Resources --- progress("Loading resources...") i, v, p = self.versionInfo self.resourceLoader = i.getResourceLoader(v, p) self.geometryCache = GeometryCache() self.blockModels = BlockModels(self.worldEditor.blocktypes, self.resourceLoader) self.textureAtlas = TextureAtlas(self.worldEditor, self.resourceLoader, self.blockModels) self.editorOverlay = scenegraph.Node() # --- Panels --- progress("Loading panels...") self.playerPanel = PlayerPanel(self) self.panels = [self.playerPanel] # --- Tools --- progress("Loading tools...") self.toolClasses = list(editortools.ToolClasses()) self.toolActionGroup = QtGui.QActionGroup(self) self.tools = [cls(self) for cls in self.toolClasses] self.toolActions = [tool.pickToolAction() for tool in self.tools] self.actionsByName = { action.toolName: action for action in self.toolActions } for tool in self.tools: tool.toolPicked.connect(self.chooseTool) for action in self.toolActions: self.toolActionGroup.addAction(action) self.selectionTool = self.getTool("Select") self.moveTool = self.getTool("Move") # --- Dimensions --- def _dimChanged(f): def _changed(): self.gotoDimension(f) return _changed dimButton = self.changeDimensionButton = QtGui.QToolButton() dimButton.setText(self.dimensionMenuLabel("")) dimAction = self.changeDimensionAction = QtGui.QWidgetAction(self) dimAction.setDefaultWidget(dimButton) dimMenu = self.dimensionsMenu = QtGui.QMenu() for dimName in self.worldEditor.listDimensions(): displayName = self.dimensionDisplayName(dimName) action = dimMenu.addAction(displayName) action._changed = _dimChanged(dimName) action.triggered.connect(action._changed) dimButton.setMenu(dimMenu) dimButton.setPopupMode(dimButton.InstantPopup) progress("Loading overworld dimension") self.gotoDimension("") # --- Editor stuff --- progress("Creating EditorTab...") self.editorTab = EditorTab(self) self.toolChanged.connect(self.toolDidChange) self.undoStack.indexChanged.connect(self.undoIndexChanged) self.findReplaceDialog = FindReplaceDialog(self) for resultsWidget in self.findReplaceDialog.resultsWidgets: self.dockWidgets.append((Qt.BottomDockWidgetArea, resultsWidget)) self.inspectorWidget = InspectorWidget(self) self.inspectorDockWidget = QtGui.QDockWidget(self.tr("Inspector"), objectName="inspector") self.inspectorDockWidget.setWidget(self.inspectorWidget) self.inspectorDockWidget.hide() self.dockWidgets.append( (Qt.RightDockWidgetArea, self.inspectorDockWidget)) if len(self.toolActions): self.toolActions[0].trigger( ) # Must be called after toolChanged is connected to editorTab if hasattr(progress, 'progressCount') and progress.progressCount != progressMax: log.info("Update progressMax to %d, please.", progress.progressCount)
def __init__(self, *args, **kwargs): EditorTool.__init__(self, *args, **kwargs) self.livePreview = False self.blockPreview = False self.glPreview = True toolWidget = QtGui.QWidget() self.toolWidget = toolWidget column = [] self.generatorTypes = [ pluginClass(self) for pluginClass in _pluginClasses ] self.currentGenerator = None if len(self.generatorTypes): self.currentGenerator = self.generatorTypes[0] self.generatorTypeInput = QtGui.QComboBox() self.generatorTypesChanged() self.generatorTypeInput.currentIndexChanged.connect( self.currentTypeChanged) self.livePreviewCheckbox = QtGui.QCheckBox("Live Preview") self.livePreviewCheckbox.setChecked(self.livePreview) self.livePreviewCheckbox.toggled.connect(self.livePreviewToggled) self.blockPreviewCheckbox = QtGui.QCheckBox("Block Preview") self.blockPreviewCheckbox.setChecked(self.blockPreview) self.blockPreviewCheckbox.toggled.connect(self.blockPreviewToggled) self.glPreviewCheckbox = QtGui.QCheckBox("GL Preview") self.glPreviewCheckbox.setChecked(self.glPreview) self.glPreviewCheckbox.toggled.connect(self.glPreviewToggled) self.optionsHolder = QtGui.QStackedWidget() self.optionsHolder.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) self.generateButton = QtGui.QPushButton(self.tr("Generate")) self.generateButton.clicked.connect(self.generateClicked) column.append(self.generatorTypeInput) column.append(self.livePreviewCheckbox) column.append(self.blockPreviewCheckbox) column.append(self.glPreviewCheckbox) column.append(self.optionsHolder) column.append(self.generateButton) self.toolWidget.setLayout(Column(*column)) self.overlayNode = scenegraph.Node() self.sceneHolderNode = scenegraph.TranslateNode() self.overlayNode.addChild(self.sceneHolderNode) self.previewNode = None self.boxHandleNode = BoxHandle() self.boxHandleNode.boundsChanged.connect(self.boundsDidChange) self.boxHandleNode.boundsChangedDone.connect(self.boundsDidChangeDone) self.overlayNode.addChild(self.boxHandleNode) self.worldScene = None self.loader = None self.previewBounds = None self.schematicBounds = None self.currentSchematic = None self.currentTypeChanged(0) # Name of last selected generator plugin is saved after unloading # so it can be reselected if it is immediately reloaded self._lastTypeName = None _GeneratePlugins.instance.pluginAdded.connect(self.addPlugin) _GeneratePlugins.instance.pluginRemoved.connect(self.removePlugin)
def makeChunkVertices(self, chunk, limitBox): """ :param chunk: :type chunk: WorldEditorChunk :param limitBox: :return: :raise: """ dim = chunk.dimension cx, cz = chunk.chunkPosition if not hasattr(chunk, 'HeightMap') or chunk.HeightMap is None: return heightMap = chunk.HeightMap chunkWidth = chunkLength = 16 chunkHeight = chunk.dimension.bounds.height z, x = list(numpy.indices((chunkLength, chunkWidth))) y = (heightMap - 1)[:chunkLength, :chunkWidth] numpy.clip(y, 0, chunkHeight - 1, y) nonZeroHeights = y > 0 heights = y.reshape((16, 16)) x = x[nonZeroHeights] if not len(x): return z = z[nonZeroHeights] y = y[nonZeroHeights] # Get the top block in each column blockResult = dim.getBlocks(x + (cx * 16), y, z + (cz * 16), return_Data=True) topBlocks = blockResult.Blocks topBlockData = blockResult.Data # Get the block above each column top. We'll recolor the top face of the column if a flower or another # transparent block is on top. aboveY = y + 1 numpy.clip(aboveY, 0, chunkHeight - 1, aboveY) blocksAbove = dim.getBlocks(x + (cx * 16), aboveY, z + (cz * 16)).Blocks flatcolors = dim.blocktypes.mapColor[topBlocks, topBlockData][:, numpy.newaxis, :] yield vertexBuffer = QuadVertexArrayBuffer(len(x), textures=False, lights=False) vertexBuffer.vertex[..., 0] = x[:, numpy.newaxis] vertexBuffer.vertex[..., 1] = y[:, numpy.newaxis] vertexBuffer.vertex[..., 2] = z[:, numpy.newaxis] va0 = vertexBuffer.copy() va0.vertex[:] += standardCubeTemplates[faces.FaceYIncreasing, ..., :3] overmask = blocksAbove > 0 colors = dim.blocktypes.mapColor[:, 0][blocksAbove[overmask]][:, numpy.newaxis] flatcolors[overmask] = colors if self.detailLevel == 2: heightfactor = (y / float(chunk.dimension.bounds.height)) * 0.33 + 0.66 flatcolors[..., :3] *= heightfactor[:, numpy.newaxis, numpy.newaxis] # xxx implicit cast from byte to float and back va0.rgb[:] = flatcolors yield if self.detailLevel == 2: self.sceneNode = scenegraph.VertexNode(va0) return # Calculate how deep each column needs to go to be flush with the adjacent column; # If columns extend all the way down, performance suffers due to fill rate. depths = numpy.zeros((chunkWidth, chunkLength), dtype='uint16') depths[1:-1, 1:-1] = reduce(numpy.minimum, (heights[1:-1, :-2], heights[1:-1, 2:], heights[:-2, 1:-1], heights[2:, 1:-1])) depths = depths[nonZeroHeights] yield va1 = vertexBuffer.copy() va1.vertex[..., :3] += standardCubeTemplates[faces.FaceXIncreasing, ..., :3] va1.vertex[:, 0, 1] = depths va1.vertex[:, 0, 1] = depths # stretch to floor va1.vertex[:, (2, 3), 1] -= 0.5 # drop down to prevent intersection pixels flatcolors *= 0.8 va1.rgb[:] = flatcolors grassmask = topBlocks == 2 # color grass sides with dirt's color va1.rgb[grassmask] = dim.blocktypes.mapColor[:, 0][[3]][:, numpy.newaxis] va2 = va1.copy() va1.vertex[:, (1, 2), 0] -= 1.0 # turn diagonally va2.vertex[:, (0, 3), 0] -= 1.0 # turn diagonally nodes = [scenegraph.VertexNode(v) for v in (va1, va2, va0)] self.sceneNode = scenegraph.Node() for node in nodes: self.sceneNode.addChild(node)
def __init__(self, filename, versionInfo, readonly=False): QtCore.QObject.__init__(self) self.undoStack = MCEUndoStack() self.filename = filename self.dockWidgets = [] self.undoBlock = None self.currentTool = None self.dirty = False self.copiedSchematic = None """:type : WorldEditor""" self.versionInfo = versionInfo # --- Open world editor --- try: self.worldEditor = WorldEditor(filename, readonly=readonly) except UndoFolderExists: msgBox = QtGui.QMessageBox() msgBox.setIcon(QtGui.QMessageBox.Warning) msgBox.setWindowTitle(self.tr("MCEdit tech demo")) msgBox.setText( self.tr("This world was not properly closed by MCEdit.")) msgBox.setInformativeText( self. tr("MCEdit may have crashed. An undo history was found for this world. You may try to resume editing " "with the saved undo history, or start over with the current state of the world." )) resumeBtn = msgBox.addButton("Resume Editing", QtGui.QMessageBox.ApplyRole) msgBox.addButton("Discard History", QtGui.QMessageBox.DestructiveRole) # msgBox.exec_() # clicked = msgBox.clickedButton() clicked = None # xxxxx resume = clicked is resumeBtn try: self.worldEditor = WorldEditor(filename, readonly=readonly, resume=resume) except NotImplementedError: NotImplementedYet() raise IOError("Uh-oh") self.worldEditor.requireRevisions() self.currentDimension = self.worldEditor.getDimension() self.loader = chunkloader.ChunkLoader(self.currentDimension) self.loader.chunkCompleted.connect(self.chunkDidComplete) self.loader.allChunksDone.connect( lambda: self.editorTab.currentView().update()) # --- Menus --- self.menus = [] self.menuEdit = QtGui.QMenu(self.tr("Edit")) self.menuEdit.setObjectName("menuEdit") self.actionCut = QtGui.QAction(self.tr("Cut"), self, triggered=self.cut, enabled=False) self.actionCut.setObjectName("actionCut") self.actionCopy = QtGui.QAction(self.tr("Copy"), self, triggered=self.copy, enabled=False) self.actionCopy.setObjectName("actionCopy") self.actionPaste = QtGui.QAction(self.tr("Paste"), self, triggered=self.paste, enabled=False) self.actionPaste.setObjectName("actionPaste") self.actionPaste_Blocks = QtGui.QAction(self.tr("Paste Blocks"), self, triggered=self.pasteBlocks, enabled=False) self.actionPaste_Blocks.setObjectName("actionPaste_Blocks") self.actionPaste_Entities = QtGui.QAction(self.tr("Paste Entities"), self, triggered=self.pasteEntities, enabled=False) self.actionPaste_Entities.setObjectName("actionPaste_Entities") self.actionClear = QtGui.QAction(self.tr("Clear"), self, triggered=self.clear, enabled=False) self.actionClear.setObjectName("actionClear") undoAction = self.undoStack.createUndoAction(self.menuEdit) undoAction.setShortcut(QtGui.QKeySequence.Undo) redoAction = self.undoStack.createRedoAction(self.menuEdit) redoAction.setShortcut(QtGui.QKeySequence.Redo) self.menuEdit.addAction(undoAction) self.menuEdit.addAction(redoAction) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionCut) self.menuEdit.addAction(self.actionCopy) self.menuEdit.addAction(self.actionPaste) self.menuEdit.addAction(self.actionPaste_Blocks) self.menuEdit.addAction(self.actionPaste_Entities) self.menuEdit.addAction(self.actionClear) self.actionCut.setShortcut(QtGui.QKeySequence.Cut) self.actionCopy.setShortcut(QtGui.QKeySequence.Copy) self.actionPaste.setShortcut(QtGui.QKeySequence.Paste) self.actionPaste_Blocks.setShortcut(QtGui.QKeySequence("Ctrl+Shift+V")) self.actionPaste_Entities.setShortcut(QtGui.QKeySequence("Ctrl+Alt+V")) self.actionClear.setShortcut(QtGui.QKeySequence.Quit) self.menus.append(self.menuEdit) # --- Resources --- i, v, p = self.versionInfo self.resourceLoader = i.getResourceLoader(v, p) self.geometryCache = GeometryCache() self.blockModels = BlockModels(self.worldEditor.blocktypes, self.resourceLoader) self.textureAtlas = TextureAtlas(self.worldEditor, self.resourceLoader, self.blockModels) self.editorOverlay = scenegraph.Node() # --- Panels --- self.playerPanel = PlayerPanel(self) self.panels = [self.playerPanel] # --- Tools --- def PickToolAction(tool): name = tool.name iconName = tool.iconName if iconName: iconPath = resourcePath( "mcedit2/assets/mcedit2/toolicons/%s.png" % iconName) if not os.path.exists(iconPath): log.error("Tool icon %s not found", iconPath) icon = None else: icon = QtGui.QIcon(iconPath) else: icon = None def _triggered(): self.chooseTool(name) action = QtGui.QAction( self.tr(name), self, #shortcut=self.toolShortcut(name), # xxxx coordinate with view movement keys triggered=_triggered, checkable=True, icon=icon, ) action.toolName = name action._triggered = _triggered # Needed because connecting _triggered doesn't increase its refcount self.toolActionGroup.addAction(action) return action self.toolClasses = list(editortools.ToolClasses()) self.toolActionGroup = QtGui.QActionGroup(self) self.toolActions = [PickToolAction(cls) for cls in self.toolClasses] self.actionsByName = { action.toolName: action for action in self.toolActions } self.tools = {cls.name: cls(self) for cls in self.toolClasses} self.selectionTool = self.tools["Select"] self.moveTool = self.tools["Move"] # --- Editor stuff --- self.editorTab = EditorTab(self) self.toolChanged.connect(self.editorTab.toolDidChange) self.undoStack.indexChanged.connect(self.undoIndexChanged) if len(self.toolActions): self.toolActions[0].trigger( ) # Must be called after toolChanged is connected to editorTab