Use "threading-model Cull/Draw" with "render.setShaderAuto()

#!/usr/bin/python
#coding:utf8

from direct.showbase.ShowBase import ShowBase
# Actor 需要单独导入
from direct.actor.Actor import Actor
from direct.task import Task
from panda3d.core import loadPrcFile, PStatCollector
from panda3d.core import AmbientLight,DirectionalLight, Vec4
import sys
import math
import os

class MyApp(ShowBase):

	key = {'left':False, 'right':False, 'up':False, 
			'down':False, 'crouch':False, 'mouse':False, 
			'shift':False}

	def __init__(self):
		ShowBase.__init__(self)

		# 禁用默认的鼠标操作
		self.disableMouse()

		g = loader.loadModel('bridge')
		g.reparentTo(render)

		self.camera.setPos(0,-12,4)
		self.camera.setP(-12)


		# DirectionalLight: 有方向的平行光
		pLight = DirectionalLight("pLight")
		pLight.setColor(Vec4( 0.8,0.8,0.8,1 ) )
		pLight.setShadowCaster(True,1024, 1024)
		pLight.getLens().setNearFar(5,31)
		pLight.getLens().setFilmSize(44)
		plnp = render.attachNewNode(pLight)
		plnp.setPos(0,-0,10)
		plnp.setHpr(30,-60,0)
		render.setLight(plnp)

		# AmbientLight: 没有方向的环境光
		ambientLight = AmbientLight("ambientLight")
		ambientLight.setColor(Vec4(0.8,0.8,0.8,1))
		alnp = render.attachNewNode(ambientLight)
		render.setLight(alnp)

		#######################################################################################
		render.setShaderAuto()
		#######################################################################################

		self.player = Actor('setsuna',
							{'stand':'setsuna-stand',
							'run':'setsuna-run',
							'walk':'setsuna-walk',
							'crouch':'setsuna-crouch',
							'zyj':'setsuna-zyj',
							'blyhz1':'setsuna-blyhz1',
							'blyhz2':'setsuna-blyhz2',
							'blyhz3':'setsuna-blyhz3'})
		self.player.reparentTo(render)
		self.player.pose('stand', 0)

		center = render.attachNewNode("center")
		center.reparentTo(self.player)
		center.setCompass()
		self.camera.reparentTo(center)
		plnp.reparentTo(center)

		taskMgr.add(self.task, 'mainTask')


		self.accept(",", self.keyboard, ['up', True])
		self.accept(",-up", self.keyboard, ['up', False])
		self.accept("o", self.keyboard, ['down', True])
		self.accept("o-up", self.keyboard, ['down', False])
		self.accept("a", self.keyboard, ['left', True])
		self.accept("a-up", self.keyboard, ['left', False])
		self.accept("e", self.keyboard, ['right', True])
		self.accept("e-up", self.keyboard, ['right', False])

		self.accept("arrow_up", self.keyboard, ['up', True])
		self.accept("arrow_up-up", self.keyboard, ['up', False])
		self.accept("arrow_down", self.keyboard, ['down', True])
		self.accept("arrow_down-up", self.keyboard, ['down', False])
		self.accept("arrow_left", self.keyboard, ['left', True])
		self.accept("arrow_left-up", self.keyboard, ['left', False])
		self.accept("arrow_right", self.keyboard, ['right', True])
		self.accept("arrow_right-up", self.keyboard, ['right', False])

		self.accept("shift", self.keyboard, ['shift', True])
		# lshift
		self.accept("shift-up", self.keyboard, ['shift', False])

		self.accept("shift-,", self.keyboard, ['up', True])
		self.accept("shift-,-up", self.keyboard, ['up', False])
		self.accept("shift-o", self.keyboard, ['down', True])
		self.accept("shift-o-up", self.keyboard, ['down', False])
		self.accept("shift-a", self.keyboard, ['left', True])
		self.accept("shift-a-up", self.keyboard, ['left', False])
		self.accept("shift-e", self.keyboard, ['right', True])
		self.accept("shift-e-up", self.keyboard, ['right', False])

		self.accept("shift-arrow_up", self.keyboard, ['up', True])
		self.accept("shift-arrow_up-up", self.keyboard, ['up', False])
		self.accept("shift-arrow_down", self.keyboard, ['down', True])
		self.accept("shift-arrow_down-up", self.keyboard, ['down', False])
		self.accept("shift-arrow_left", self.keyboard, ['left', True])
		self.accept("shift-arrow_left-up", self.keyboard, ['left', False])
		self.accept("shift-arrow_right", self.keyboard, ['right', True])
		self.accept("shift-arrow_right-up", self.keyboard, ['right', False])

		self.accept("mouse1", self.keyboard, ['mouse', True])
		self.accept("mouse1-up", self.keyboard, ['mouse', False])

		self.accept("q", self.keyboard, ['crouch', True])
		self.accept("q-up", self.keyboard, ['crouch', False])

		self.accept("h", self.attack, ['light'])


	def p(self, string):
		print(string)

	def keyboard(self, name, value):

		self.key[name] = value

		if self.key['mouse']:
			play = 'walk'
		elif self.key['up']:
			play = 'walk'
			self.player.setH(180)
			if self.key['left']:
				self.player.setH(215)
			elif self.key['right']:
				self.player.setH(135)
		elif self.key['down']:
			play = 'walk'
			self.player.setH(0)
			if self.key['left']:
				self.player.setH(-45)
			elif self.key['right']:
				self.player.setH(45)
		elif self.key['left']:
			play = 'walk'
			self.player.setH(-90)
		elif self.key['right']:
			play = 'walk'
			self.player.setH(90)
		elif self.key['crouch']:
			play = 'crouch'
		else:
			play = 'stand'

		if play == 'walk' and self.key['shift']:
			play = 'run'

		if play != self.player.getCurrentAnim():
			if play == 'walk':
				self.player.loop('walk')
			elif play == 'run':
				self.player.loop('run')
			elif play == 'stand':
				self.player.pose('stand', 0)
			elif play == 'crouch':
				self.player.play('crouch')

	def attack(self, widget):
		play = self.player.getCurrentAnim()
		if widget=='light':
			if self.key['crouch']:
				self.player.play('zyj')
			elif play==None:
				self.player.play('blyhz1')
			elif play=='blyhz1':
				frame = self.player.getCurrentFrame('blyhz1')
				if frame>=9 and frame<=15:
					self.player.play('blyhz2')
			elif play=='blyhz2':
				frame = self.player.getCurrentFrame('blyhz2')
				if frame>=3 and frame<=9:
					self.player.play('blyhz3')
			

	def task(self, task):
		play = self.player.getCurrentAnim()
		if self.key['mouse']:
			if base.mouseWatcherNode.hasMouse():
				x=base.mouseWatcherNode.getMouseX()
				y=base.mouseWatcherNode.getMouseY()
				self.player.setH(math.atan2(y,x)*57.29578+90)

		if play == 'walk':
			self.player.setPos(self.player, 0, -task.time*2, 0)
		elif play == 'run':
			self.player.setPos(self.player, 0, -task.time*5, 0)
		return task.again
		

#######################################################################################
loadPrcFile(sys.path[0]+"/Config.prc")
#######################################################################################
app = MyApp()
app.run()

When I use “threading-model Cull/Draw” without “render.setShaderAuto()”, it work.
When I only use “render.setShaderAuto()”, it work again.
But I use “threading-model Cull/Draw” with “render.setShaderAuto()”, it loss of response.

It’s my Config.prc file:

text-encoding		utf8
show-frame-rate-meter	#t
show-buffers			#f
sync-video				#t
want-pstats				#t