mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
146 lines
5.2 KiB
Python
146 lines
5.2 KiB
Python
"""OnscreenImage module: contains the OnscreenImage class"""
|
|
|
|
from direct.showbase.PandaObject import *
|
|
import types
|
|
|
|
class OnscreenImage(PandaObject, NodePath):
|
|
def __init__(self, image = None,
|
|
pos = None,
|
|
hpr = None,
|
|
scale = None,
|
|
color = None,
|
|
parent = None,
|
|
sort = 0):
|
|
"""__init__(self, ...)
|
|
|
|
Make a image node from string or a node path,
|
|
put it into the 2d sg and set it up with all the indicated parameters.
|
|
|
|
The parameters are as follows:
|
|
|
|
image: the actual geometry to display or a file name.
|
|
This may be omitted and specified later via setImage()
|
|
if you don't have it available.
|
|
|
|
pos: the x, y, z position of the geometry on the screen.
|
|
This maybe a 3-tuple of floats or a vector.
|
|
y should be zero
|
|
|
|
hpr: the h,p,r of the geometry on the screen.
|
|
This maybe a 3-tuple of floats or a vector.
|
|
|
|
scale: the size of the geometry. This may either be a single
|
|
float, a 3-tuple of floats, or a vector, specifying a
|
|
different x, y, z scale. y should be 1
|
|
|
|
color: the (r, g, b, a) color of the geometry. This is
|
|
normally a 4-tuple of floats or ints.
|
|
|
|
parent: the NodePath to parent the geometry to initially.
|
|
"""
|
|
# We ARE a node path. Initially, we're an empty node path.
|
|
NodePath.__init__(self)
|
|
if parent == None:
|
|
parent = aspect2d
|
|
# Assign geometry
|
|
if isinstance(image, NodePath):
|
|
self.assign(image.copyTo(parent, sort))
|
|
elif type(image) == type(''):
|
|
# Assume its a file name and create a texture card
|
|
tex = loader.loadTexture(image)
|
|
cm = CardMaker('OnscreenImage')
|
|
cm.setFrame(-1, 1, -1, 1)
|
|
self.assign(parent.attachNewNode(cm.generate(), sort))
|
|
self.setTexture(tex)
|
|
elif type(image) == type(()):
|
|
# Assume its a file+node name, extract texture from node
|
|
model = loader.loadModelOnce(image[0])
|
|
if model:
|
|
node = model.find(image[1])
|
|
if node:
|
|
#print 'assigning'
|
|
self.assign(node.copyTo(parent, sort))
|
|
else:
|
|
print 'OnscreenImage: node %s not found' % image[1]
|
|
return
|
|
model.removeNode()
|
|
else:
|
|
print 'OnscreenImage: model %s not found' % image[0]
|
|
return
|
|
|
|
# Adjust pose
|
|
# Set pos
|
|
if (isinstance(pos, types.TupleType) or
|
|
isinstance(pos, types.ListType)):
|
|
apply(self.setPos, pos)
|
|
elif isinstance(pos, VBase3):
|
|
self.setPos(pos)
|
|
# Hpr
|
|
if (isinstance(hpr, types.TupleType) or
|
|
isinstance(hpr, types.ListType)):
|
|
apply(self.setHpr, hpr)
|
|
elif isinstance(hpr, VBase3):
|
|
self.setHpr(hpr)
|
|
# Scale
|
|
if (isinstance(scale, types.TupleType) or
|
|
isinstance(scale, types.ListType)):
|
|
apply(self.setScale, scale)
|
|
elif isinstance(scale, VBase3):
|
|
self.setScale(scale)
|
|
elif (isinstance(scale, types.FloatType) or
|
|
isinstance(scale, types.IntType)):
|
|
self.setScale(scale)
|
|
|
|
# Set color
|
|
if color:
|
|
# Set color, if specified
|
|
self.setColor(color[0], color[1], color[2], color[3])
|
|
|
|
def setImage(self, image):
|
|
parent = self.getParent()
|
|
# Assign geometry
|
|
self.removeNode()
|
|
if isinstance(image, NodePath):
|
|
self.assign(image.copyTo(parent))
|
|
elif type(image) == type(()):
|
|
model = loader.loadModelOnce(image[0])
|
|
self.assign(model.find(image[1]))
|
|
self.reparentTo(parent)
|
|
model.removeNode()
|
|
|
|
def getImage(self):
|
|
return self
|
|
|
|
def configure(self, option=None, **kw):
|
|
for option, value in kw.items():
|
|
# Use option string to access setter function
|
|
try:
|
|
setter = eval('self.set' +
|
|
string.upper(option[0]) + option[1:])
|
|
if (((setter == self.setPos) or
|
|
(setter == self.setHpr) or
|
|
(setter == self.setScale)) and
|
|
(isinstance(value, types.TupleType) or
|
|
isinstance(value, types.ListType))):
|
|
apply(setter,value)
|
|
else:
|
|
setter(value)
|
|
except AttributeError:
|
|
print 'OnscreenText.configure: invalid option:', option
|
|
|
|
# Allow index style references
|
|
def __setitem__(self, key, value):
|
|
apply(self.configure, (), {key: value})
|
|
|
|
def cget(self, option):
|
|
# Get current configuration setting.
|
|
# This is for compatability with DirectGui functions
|
|
getter = eval('self.get' + string.upper(option[0]) + option[1:])
|
|
return getter()
|
|
|
|
# Allow index style refererences
|
|
__getitem__ = cget
|
|
|
|
def destroy(self):
|
|
self.removeNode()
|