def __init__(self, dimension, textureAtlas=None, geometryCache=None, bounds=None): super(WorldScene, self).__init__() self.dimension = dimension self.textureAtlas = textureAtlas self.depthOffsetNode = DepthOffsetNode(DepthOffset.Renderer) self.addChild(self.depthOffsetNode) self.textureAtlasNode = TextureAtlasNode(textureAtlas) self.depthOffsetNode.addChild(self.textureAtlasNode) self.renderstateNodes = {} for rsClass in renderstates.allRenderstates: rsNode = scenenode.RenderstateNode(rsClass) self.textureAtlasNode.addChild(rsNode) self.renderstateNodes[rsClass] = rsNode self.groupNodes = {} # by renderstate self.chunkRenderInfo = {} self.visibleLayers = set(Layer.DefaultVisibleLayers) self.updateTask = SceneUpdateTask(self, textureAtlas) if geometryCache is None: geometryCache = GeometryCache() self.geometryCache = geometryCache self.showRedraw = False self.minlod = 0 self.bounds = bounds
class WorldScene(scenenode.Node): def __init__(self, dimension, textureAtlas=None, geometryCache=None, bounds=None): super(WorldScene, self).__init__() self.dimension = dimension self.textureAtlas = textureAtlas self.depthOffsetNode = DepthOffsetNode(DepthOffset.Renderer) self.addChild(self.depthOffsetNode) self.textureAtlasNode = TextureAtlasNode(textureAtlas) self.depthOffsetNode.addChild(self.textureAtlasNode) self.renderstateNodes = {} for rsClass in renderstates.allRenderstates: rsNode = scenenode.RenderstateNode(rsClass) self.textureAtlasNode.addChild(rsNode) self.renderstateNodes[rsClass] = rsNode self.groupNodes = {} # by renderstate self.chunkRenderInfo = {} self.visibleLayers = set(Layer.DefaultVisibleLayers) self.updateTask = SceneUpdateTask(self, textureAtlas) if geometryCache is None: geometryCache = GeometryCache() self.geometryCache = geometryCache self.showRedraw = False self.minlod = 0 self.bounds = bounds def setTextureAtlas(self, textureAtlas): if textureAtlas is not self.textureAtlas: self.textureAtlas = textureAtlas self.textureAtlasNode.textureAtlas = textureAtlas self.updateTask.textureAtlas = textureAtlas self.discardAllChunks() def chunkPositions(self): return self.chunkRenderInfo.iterkeys() def getRenderstateGroup(self, rsClass): groupNode = self.groupNodes.get(rsClass) if groupNode is None: groupNode = ChunkGroupNode() self.groupNodes[rsClass] = groupNode self.renderstateNodes[rsClass].addChild(groupNode) return groupNode def discardChunk(self, cx, cz): """ Discard the chunk at the given position from the scene """ for groupNode in self.groupNodes.itervalues(): groupNode.discardChunkNode(cx, cz) self.chunkRenderInfo.pop((cx, cz), None) def discardChunks(self, chunks): for cx, cz in chunks: self.discardChunk(cx, cz) def discardAllChunks(self): for groupNode in self.groupNodes.itervalues(): groupNode.clear() self.chunkRenderInfo.clear() def invalidateChunk(self, cx, cz, invalidLayers=None): """ Mark the chunk for regenerating vertex data """ if invalidLayers is None: invalidLayers = Layer.AllLayers node = self.chunkRenderInfo.get((cx, cz)) if node: node.invalidLayers.update(invalidLayers) _fastLeaves = False @property def fastLeaves(self): return self._fastLeaves @fastLeaves.setter def fastLeaves(self, val): if self._fastLeaves != bool(val): self.discardAllChunks() self._fastLeaves = bool(val) _roughGraphics = False @property def roughGraphics(self): return self._roughGraphics @roughGraphics.setter def roughGraphics(self, val): if self._roughGraphics != bool(val): self.discardAllChunks() self._roughGraphics = bool(val) _showHiddenOres = False @property def showHiddenOres(self): return self._showHiddenOres @showHiddenOres.setter def showHiddenOres(self, val): if self._showHiddenOres != bool(val): self.discardAllChunks() self._showHiddenOres = bool(val) def wantsChunk(self, cPos): return self.updateTask.wantsChunk(cPos) def workOnChunk(self, chunk, visibleSections=None): return self.updateTask.workOnChunk(chunk, visibleSections) def chunkNotPresent(self, cPos): self.updateTask.chunkNotPresent(cPos) def getChunkRenderInfo(self, cPos): chunkInfo = self.chunkRenderInfo.get(cPos) if chunkInfo is None: #log.info("Creating ChunkRenderInfo %s in %s", cPos, self.worldScene) chunkInfo = ChunkRenderInfo(self, cPos) self.chunkRenderInfo[cPos] = chunkInfo return chunkInfo def setLayerVisible(self, layerName, visible): if visible: self.visibleLayers.add(layerName) else: self.visibleLayers.discard(layerName) for groupNode in self.groupNodes.itervalues(): groupNode.setLayerVisible(layerName, visible) def setVisibleLayers(self, layerNames): self.visibleLayers = set(layerNames)