This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
mcedit/editortools/blockview.py

169 lines
5.2 KiB
Python

from OpenGL import GL
from numpy import array
from albow import ButtonBase, ValueDisplay, AttrRef, Row
from albow.openglwidgets import GLOrtho
import thumbview
import blockpicker
from glbackground import Panel, GLBackground
from glutils import DisplayList
class BlockView(GLOrtho):
def __init__(self, materials, blockInfo=None):
GLOrtho.__init__(self)
self.list = DisplayList(self._gl_draw)
self.blockInfo = blockInfo or materials.Air
self.materials = materials
listBlockInfo = None
def gl_draw(self):
if self.listBlockInfo != self.blockInfo:
self.list.invalidate()
self.listBlockInfo = self.blockInfo
self.list.call()
def _gl_draw(self):
blockInfo = self.blockInfo
if blockInfo.ID is 0:
return
GL.glColor(1.0, 1.0, 1.0, 1.0)
GL.glEnable(GL.GL_TEXTURE_2D)
GL.glEnable(GL.GL_ALPHA_TEST)
self.materials.terrainTexture.bind()
pixelScale = 0.5 if self.materials.name in ("Pocket", "Alpha") else 1.0
texSize = 16 * pixelScale
GL.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY)
GL.glVertexPointer(2, GL.GL_FLOAT, 0, array([-1, -1,
- 1, 1,
1, 1,
1, -1, ], dtype='float32'))
texOrigin = array(self.materials.blockTextures[blockInfo.ID, blockInfo.blockData, 0])
texOrigin *= pixelScale
GL.glTexCoordPointer(2, GL.GL_FLOAT, 0, array([texOrigin[0], texOrigin[1] + texSize,
texOrigin[0], texOrigin[1],
texOrigin[0] + texSize, texOrigin[1],
texOrigin[0] + texSize, texOrigin[1] + texSize], dtype='float32'))
GL.glDrawArrays(GL.GL_QUADS, 0, 4)
GL.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY)
GL.glDisable(GL.GL_ALPHA_TEST)
GL.glDisable(GL.GL_TEXTURE_2D)
@property
def tooltipText(self):
return "{0}".format(self.blockInfo.name)
class BlockButton(ButtonBase, Panel):
_ref = None
def __init__(self, materials, blockInfo=None, ref=None, recentBlocks=None, *a, **kw):
self.allowWildcards = False
Panel.__init__(self, *a, **kw)
self.bg_color = (1, 1, 1, 0.25)
self._ref = ref
if blockInfo is None and ref is not None:
blockInfo = ref.get()
blockInfo = blockInfo or materials.Air
if recentBlocks is not None:
self.recentBlocks = recentBlocks
else:
self.recentBlocks = []
self.blockView = thumbview.BlockThumbView(materials, blockInfo, size=(48, 48))
self.blockLabel = ValueDisplay(ref=AttrRef(self, 'labelText'), width=180, align="l")
row = Row((self.blockView, self.blockLabel), align="b")
# col = Column( (self.blockButton, self.blockNameLabel) )
self.add(row)
self.shrink_wrap()
# self.blockLabel.bottom = self.blockButton.bottom
# self.blockLabel.centerx = self.blockButton.centerx
# self.add(self.blockLabel)
self.materials = materials
self.blockInfo = blockInfo
# self._ref = ref
self.updateRecentBlockView()
recentBlockLimit = 7
@property
def blockInfo(self):
if self._ref:
return self._ref.get()
else:
return self._blockInfo
@blockInfo.setter
def blockInfo(self, bi):
if self._ref:
self._ref.set(bi)
else:
self._blockInfo = bi
self.blockView.blockInfo = bi
if bi not in self.recentBlocks:
self.recentBlocks.append(bi)
if len(self.recentBlocks) > self.recentBlockLimit:
self.recentBlocks.pop(0)
self.updateRecentBlockView()
@property
def labelText(self):
labelText = self.blockInfo.name
if len(labelText) > 24:
labelText = labelText[:23] + "..."
return labelText
# self.blockNameLabel.text =
def createRecentBlockView(self):
def makeBlockView(bi):
bv = BlockView(self.materials, bi)
bv.size = (16, 16)
def action(evt):
self.blockInfo = bi
bv.mouse_up = action
return bv
row = [makeBlockView(bi) for bi in self.recentBlocks]
row = Row(row)
widget = GLBackground()
widget.bg_color = (0.8, 0.8, 0.8, 0.8)
widget.add(row)
widget.shrink_wrap()
widget.anchor = "whtr"
return widget
def updateRecentBlockView(self):
if self.recentBlockView:
self.recentBlockView.set_parent(None)
self.recentBlockView = self.createRecentBlockView()
self.recentBlockView.right = self.width
self.add(self.recentBlockView)
#print self.rect, self.recentBlockView.rect
recentBlockView = None
@property
def tooltipText(self):
return "{0}".format(self.blockInfo.name)
def action(self):
blockPicker = blockpicker.BlockPicker(self.blockInfo, self.materials, allowWildcards=self.allowWildcards)
if blockPicker.present():
self.blockInfo = blockPicker.blockInfo