material editor

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()
1 Like