I’m still not sure if I did this correctly, see for yourself.
from pandac.PandaModules import *
loadPrcFileData('','''
framebuffer-multisample 1
''')
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.interval.IntervalGlobal import *
from direct.actor import Actor
from direct.task import Task
from random import random
import sys
class World(DirectObject):
def __init__(self):
self.accept('escape',sys.exit)
self.accept('space',self.randomizeEnvirLightColor)
self.acceptKeys( (
'arrow_up',
'arrow_up-repeat',
), self.adjustFacingRatioPower,[.05])
self.acceptKeys( (
'arrow_down',
'arrow_down-repeat',
), self.adjustFacingRatioPower,[-.05])
balloon = loader.loadModel("frowney")
balloon.reparentTo(render)
balloon.setScale(3)
balloon.setX(-4)
model2= loader.loadModel("../samples/Sample-Programs--Teapot-on-TV/models/mechman_idle")
model2.reparentTo(render)
model2.setX(5)
tex1=loader.loadTexture('black.png')
model4=loader.loadModel("virus")
model4.reparentTo(render)
model4.setZ(5)
model4.setTexture(tex1)
self.model3= Actor.Actor("ripple",{'move':'ripple'})
self.model3.reparentTo(render)
self.model3.setScale(5)
self.model3.setY(-5)
self.model3.setP(-90)
self.model3.loop('move')
self.model3.setTexture(tex1,1)
panda=loader.loadModel("panda")
panda.reparentTo(render)
panda.setPos(0,7,-5)
loc='../samples/Sample-Programs--Roaming-Ralph/models/'
self.ralph=Actor.Actor(loc+'ralph',{'walk':loc+'ralph-walk'})
self.ralph.reparentTo(render)
self.ralph.setX(10)
self.ralph.loop('walk')
tron=loader.loadModel('../samples/Sample-Programs--Glow-Filter/models/tron')
tron.reparentTo(render)
tron.setScale(.5)
tron.setX(-10)
robot=loader.loadModel('../samples/Sample-Programs--Boxing-Robots/models/robot')
robot.reparentTo(render)
robot.setScale(.5)
robot.setTexture(tex1)
lightDum=render.attachNewNode('lightDummy')
light=loader.loadModel('misc/sphere')
light.reparentTo(lightDum)
light.setPos(15,0,5)
lightDum.setShaderOff(1)
lightDum.hprInterval(5,Vec3(360,0,0)).loop()
# default values
self.facingRatioPower=.7
self.envirLightColor=Vec4(1,1,1,0)
textcolor=(0,1,0,1)
self.facingRatioPowerText=OnscreenText('facing ratio power = %.2f' %self.facingRatioPower,
fg=textcolor,pos=(0,-.83),scale=.045,mayChange=1)
OnscreenText('[ ARROW UP/DOWN ] : adjust value',fg=textcolor,pos=(0,-.90),scale=.045)
OnscreenText('[ SPACE ] : randomize environment light color',fg=textcolor,pos=(0,-.97),scale=.045)
sha=Shader.load('facingRatio1.sha')
render.setShader(sha)
render.setShaderInput('cam',camera)
render.setShaderInput('light',light)
render.setShaderInput('envirLightColor',self.envirLightColor*self.facingRatioPower)
render.setAntialias(AntialiasAttrib.MMultisample)
taskMgr.doMethodLater(5,self.printCamTransform,'printCamTransform')
def acceptKeys(self,keys,method,extraArgs=[]):
for k in keys:
self.accept(k,method,extraArgs)
def adjustFacingRatioPower(self,amount):
self.facingRatioPower+=amount
render.setShaderInput('envirLightColor',self.envirLightColor*self.facingRatioPower)
self.facingRatioPowerText['text']='facing ratio power = %.2f' %self.facingRatioPower
def randomizeEnvirLightColor(self):
self.envirLightColor=Vec4(random(),random(),random(),0)
render.setShaderInput('envirLightColor',self.envirLightColor*self.facingRatioPower)
def printCamTransform(self,t): # print it out while trying to get the best view angle
camera.printTransform()
print
return Task.again
camera.setPos(-21.17, -27.05, 7.82)
camera.setHpr(-33.07, -13.63, -3.24)
mat=Mat4(camera.getMat())
mat.invertInPlace()
base.mouseInterfaceNode.setMat(mat)
base.setBackgroundColor(0,0,0,1)
World()
run()
facingRatio1.sha :
//Cg
void vshader(
float4 vtx_position : POSITION,
float2 vtx_texcoord0 : TEXCOORD0,
float3 vtx_normal : NORMAL,
uniform float4x4 mat_modelproj,
uniform float4 mspos_cam,
uniform float4 mspos_light,
out float l_smooth,
out float l_facingRatio,
out float2 l_texcoord0 : TEXCOORD0,
out float4 l_position : POSITION
)
{
// SMOOTH SHADING : dot product ranges from -1~1, scale it so I get 0~1,
// but before it, I set the ambient light to .2,
// so it's .5/2.5 (2.5 is -1.5~1 range), add the .5 to the dark side
l_smooth = smoothstep( -1.5,1,dot(vtx_normal, normalize(mspos_light-vtx_position)) );
l_facingRatio = pow( 1.0-saturate( dot(vtx_normal, normalize(mspos_cam-vtx_position)) ), 2 );
l_position = mul(mat_modelproj, vtx_position);
l_texcoord0=vtx_texcoord0;
}
void fshader(
in float2 l_texcoord0: TEXCOORD0,
in float l_smooth,
in float l_facingRatio,
uniform float4 k_envirLightColor,
sampler2D tex_0 : TEXUNIT0,
out float4 o_color:COLOR)
{
float4 tex = tex2D(tex_0, l_texcoord0);
// o_color = float4( tex.rgb*l_smooth, tex.a );
o_color = float4( lerp(tex.rgb*l_smooth, k_envirLightColor.rgb, l_facingRatio) , tex.a );
}
virus.egg.pz
I made frowney transparent by editing frowney.rgb, black.png is 1x1 pixel texture, I use 20,20,20 value.