Thanks for this code snippet! In case anyone’s interested, I modified it to generate cards appropriate for use in pixel2d, added support for alpha channels, and fixed some bugs:
mybutton = DirectButton(geom = makeGeom('button_ready.png'))
# Python modules
from math import log, ceil
# Panda3D modules
from panda3d.core import CardMaker
from panda3d.core import NodePath
from panda3d.core import PNMImage
from panda3d.core import Texture
from panda3d.core import Point2
from panda3d.core import TextureStage
from panda3d.core import TransparencyAttrib
cardMaker = CardMaker('CardMaker')
def nextPowOf2(n):
return 2**int(ceil(log(n, 2)))
def makeGeom(filename, booAspectCorrect=False):
origImage = PNMImage()
assert origImage.read(filename)
oldWidth = origImage.getXSize()
oldHeight = origImage.getYSize()
newWidth = nextPowOf2(oldWidth)
newHeight = nextPowOf2(oldHeight)
newImage = PNMImage(newWidth, newHeight)
if origImage.hasAlpha():
newImage.addAlpha()
newImage.copySubImage(origImage, 0, 0, 0, 0)
tex = Texture()
tex.load(newImage)
cardMaker.setFrame(0, oldWidth, 0, oldHeight)
fU = float(oldWidth)/newWidth
fV = float(oldHeight)/newHeight
# cardMaker.setHasUvs(True)
cardMaker.setUvRange(Point2(0, 0), Point2(fU, fV))
npCard = NodePath(cardMaker.generate())
npCard.setTexture(tex)
npCard.setTexOffset(TextureStage.getDefault(), 0, 1-fV)
if origImage.hasAlpha():
npCard.setTransparency(TransparencyAttrib.MAlpha)
return npCard