Doesn’t seem to be any here so I thought it will be useful to newbies who don’t know enough of DirectGUI to write one themselves:
from panda3d.core import *
loadPrcFileData('', 'win-size 800 600')
loadPrcFileData('', 'fullscreen #f')
import direct.directbase.DirectStart
from direct.gui.DirectGui import *
MODEL_FILE = 'panda'
SHADER_GENERATOR = False
base.setBackgroundColor(0.1,0.1,0.1)
if SHADER_GENERATOR == True:
render.setShaderAuto() # per-pixel lightning
# model
model = loader.loadModel(MODEL_FILE)
model.setTextureOff(1)
model.setColorOff(1)
model.reparentTo(render)
model.setPosHprScale(0,0,-2.2, 0,0,0, 0.4,0.4,0.4)
base.cam.setY(-12)
# lightning
plight = PointLight('plight')
plnp = render.attachNewNode(plight)
plnp.setPos(4,-4,8)
render.setLight(plnp)
alight = AmbientLight('alight')
alnp = render.attachNewNode(alight)
render.setLight(alnp)
# material
material = Material()
material.setAmbient(VBase4(1,1,1,1))
material.setDiffuse(VBase4(1,1,1,1))
material.setEmission(VBase4(1,1,1,1))
material.setSpecular(VBase4(1,1,1,1))
material.setShininess(1)
model.setMaterial(material, 1)
model.setTransparency(TransparencyAttrib.MDual)
material = model.getMaterial()
# GUI to change material values
def changeValue(index, type, color):
value = sliders[index]['value']
if type == 'shininess':
print type, value
else:
print type, color, value
if type == 'ambient':
if color == 'r':
material.setAmbient(VBase4(value, material.getAmbient()[1], material.getAmbient()[2], 1))
elif color == 'g':
material.setAmbient(VBase4(material.getAmbient()[0], value, material.getAmbient()[2], 1))
elif color == 'b':
material.setAmbient(VBase4(material.getAmbient()[0], material.getAmbient()[1], value, 1))
if type == 'diffuse':
if color == 'r':
material.setDiffuse(VBase4(value, material.getDiffuse()[1], material.getDiffuse()[2], 1))
elif color == 'g':
material.setDiffuse(VBase4(material.getDiffuse()[0], value, material.getDiffuse()[2], 1))
elif color == 'b':
material.setDiffuse(VBase4(material.getDiffuse()[0], material.getDiffuse()[1], value, 1))
if type == 'emissive':
if color == 'r':
material.setEmission(VBase4(value, material.getEmission()[1], material.getEmission()[2], 1))
elif color == 'g':
material.setEmission(VBase4(material.getEmission()[0], value, material.getEmission()[2], 1))
elif color == 'b':
material.setEmission(VBase4(material.getEmission()[0], material.getEmission()[1], value, 1))
if type == 'specular':
if color == 'r':
material.setSpecular(VBase4(value, material.getSpecular()[1], material.getSpecular()[2], 1))
elif color == 'g':
material.setSpecular(VBase4(material.getSpecular()[0], value, material.getSpecular()[2], 1))
elif color == 'b':
material.setSpecular(VBase4(material.getSpecular()[0], material.getSpecular()[1], value, 1))
if type == 'shininess':
material.setShininess(value)
frame = DirectFrame()
types = ('ambient', 'diffuse', 'emissive', 'specular', 'shininess')
colors = ('r', 'g', 'b')
x = 0.8
index = 0
sliders = []
for type in types:
if type == 'shininess': # single value
slider = DirectSlider(range = (0.0,100.0), value = 1.0, pageSize = 0.1, command = changeValue,
text = type, text_scale = 0.3, text_fg = (1,0.2,0.2,1), parent = frame)
sliders.append(slider)
slider['extraArgs'] = [index, type, None]
slider.setPos(-0.8,0,x)
slider.setScale(0.36)
x -= 0.1
index += 1
else:
for color in colors:
slider = DirectSlider(range = (0.0,1.0), value = 0.4, pageSize = 0.1, command = changeValue,
text = type+' '+color, text_scale = 0.3, text_fg = (1,0.2,0.2,1), parent = frame)
sliders.append(slider)
slider['extraArgs'] = [index, type, color]
slider.setPos(-0.8,0,x)
slider.setScale(0.36)
x -= 0.1
index += 1
x -= 0.1
run()