Ejemplo n.º 1
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupPostFx()

    def setupScene(self):
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(render)
        self.panda.loop("walk")

        cm = CardMaker("plane")
        cm.setFrame(-10, 10, -10, 10)
        plane = render.attachNewNode(cm.generate())
        plane.setP(270)
        
        self.cam.setPos(0, -40, 6)

        ambLight = AmbientLight("ambient")
        ambLight.setColor(Vec4(0.2, 0.1, 0.1, 1.0))
        ambNode = render.attachNewNode(ambLight)
        render.setLight(ambNode)

        dirLight = DirectionalLight("directional")
        dirLight.setColor(Vec4(0.1, 0.4, 0.1, 1.0))
        dirNode = render.attachNewNode(dirLight)
        dirNode.setHpr(60, 0, 90)
        render.setLight(dirNode)

        pntLight = PointLight("point")
        pntLight.setColor(Vec4(0.8, 0.8, 0.8, 1.0))
        pntNode = render.attachNewNode(pntLight)
        pntNode.setPos(0, 0, 15)
        self.panda.setLight(pntNode)

        sptLight = Spotlight("spot")
        sptLens = PerspectiveLens()
        sptLight.setLens(sptLens)
        sptLight.setColor(Vec4(1.0, 1.0, 1.0, 1.0))
        sptLight.setShadowCaster(True)
        sptNode = render.attachNewNode(sptLight)
        sptNode.setPos(-10, -10, 20)
        sptNode.lookAt(self.panda)
        render.setLight(sptNode)

        render.setShaderAuto()

    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        finalQuad = self.filterMan.renderSceneInto(colortex = colorTex)

        finalTex = Texture()
        interQuad = self.filterMan.renderQuadInto(colortex = finalTex, div = 8)
        interQuad.setShader(loader.loadShader("filter.cg"))
        interQuad.setShaderInput("color", colorTex)

        finalQuad.setShader(loader.loadShader("pass.cg"))
        finalQuad.setShaderInput("color", finalTex)
Ejemplo n.º 2
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupLight()
        self.setupPostFx()

    def setupScene(self):
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(render)
        self.panda.loop("walk")

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, -15, 10)

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, 0, 10)

        smiley = loader.loadModel("smiley")
        smiley.reparentTo(render)
        smiley.setPos(5, 20, 10)

        self.world = loader.loadModel("environment")
        self.world.reparentTo(render)
        self.world.setScale(0.5)
        self.world.setPos(-8, 80, 0)

        self.cam.setPos(0, -40, 6)
        self.cam.node().getLens().setNearFar(1.0, 300.0)

    def setupLight(self):
        ambLight = AmbientLight("ambient")
        ambLight.setColor(Vec4(0.2, 0.1, 0.1, 1.0))
        ambNode = render.attachNewNode(ambLight)
        render.setLight(ambNode)

        dirLight = DirectionalLight("directional")
        dirLight.setColor(Vec4(0.1, 0.4, 0.1, 1.0))
        dirNode = render.attachNewNode(dirLight)
        dirNode.setHpr(60, 0, 90)
        render.setLight(dirNode)

        pntLight = PointLight("point")
        pntLight.setColor(Vec4(0.8, 0.8, 0.8, 1.0))
        pntNode = render.attachNewNode(pntLight)
        pntNode.setPos(0, 0, 15)
        self.panda.setLight(pntNode)

        sptLight = Spotlight("spot")
        sptLens = PerspectiveLens()
        sptLight.setLens(sptLens)
        sptLight.setColor(Vec4(1.0, 1.0, 1.0, 1.0))
        sptLight.setShadowCaster(True)
        sptNode = render.attachNewNode(sptLight)
        sptNode.setPos(-10, -10, 50)
        sptNode.lookAt(self.panda)
        render.setLight(sptNode)

        render.setShaderAuto()

    def setupPostFx(self):
        self.filterMan = FilterManager(self.win, self.cam)

        colorTex = Texture()
        blurTex = Texture()
        depthTex = Texture()

        finalQuad = self.filterMan.renderSceneInto(colortex=colorTex,
                                                   depthtex=depthTex)
        blurQuad = self.filterMan.renderQuadInto(colortex=blurTex, div=4)
        blurQuad.setShader(loader.loadShader("blur.cg"))
        blurQuad.setShaderInput("color", colorTex)

        finalQuad.setShader(loader.loadShader("depth.cg"))
        finalQuad.setShaderInput("color", colorTex)
        finalQuad.setShaderInput("blur", blurTex)
        finalQuad.setShaderInput("depth", depthTex)
Ejemplo n.º 3
0
class Application(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.setupScene()
        self.setupLight()
        self.setupCams()
        self.setupPostFx()

    def setupScene(self):
        self.scene = render.attachNewNode("scene")
        self.panda = Actor("panda", {"walk": "panda-walk"})
        self.panda.reparentTo(self.scene)
        self.panda.loop("walk")

        self.world = loader.loadModel("environment")
        self.world.reparentTo(self.scene)
        self.world.setScale(0.5)
        self.world.setPos(-8, 80, 0)

        self.scene.setShaderAuto()

    def setupCams(self):
        self.lightCam = self.makeCamera(self.win)
        self.lightCam.reparentTo(self.cam)

        sceneMask = BitMask32(1)
        lightMask = BitMask32(2)
        self.cam.node().setCameraMask(sceneMask)
        self.lightCam.node().setCameraMask(lightMask)
        self.lights.hide(sceneMask)
        self.ambient.hide(sceneMask)
        self.scene.hide(lightMask)

        self.cam.node().getDisplayRegion(0).setSort(1)
        self.lightCam.node().getDisplayRegion(0).setSort(2)
        self.win.setSort(3)

        self.lightCam.node().getDisplayRegion(0).setClearColor(Vec4(
            0, 0, 0, 1))
        self.lightCam.node().getDisplayRegion(0).setClearColorActive(1)

        self.cam.setPos(0, -40, 6)

    def setupLight(self):
        self.lights = render.attachNewNode("lights")
        self.sphere = loader.loadModel("misc/sphere")

        for i in range(400):
            light = self.lights.attachNewNode("light")
            light.setPos(random.uniform(-15, 15), random.uniform(-5, 50),
                         random.uniform(0, 15))
            light.setColor(random.random(), random.random(), random.random())
            light.setScale(5)
            self.sphere.instanceTo(light)

            vlight = self.scene.attachNewNode("vlight")
            vlight.setPos(light.getPos())
            vlight.setColor(light.getColor())
            vlight.setScale(0.1)
            self.sphere.instanceTo(vlight)

        cm = CardMaker("ambient")
        cm.setFrame(-100, 100, -100, 100)
        self.ambient = render.attachNewNode("ambient")
        self.ambient.attachNewNode(cm.generate())
        self.ambient.setColor(0.1, 0.1, 0.1, 1)
        self.ambient.reparentTo(self.cam)
        self.ambient.setPos(0, 5, 0)

    def setupPostFx(self):
        self.gbufMan = FilterManager(self.win, self.cam)
        self.lightMan = FilterManager(self.win, self.lightCam)

        albedo = Texture()
        depth = Texture()
        normal = Texture()
        final = Texture()

        self.gbufMan.renderSceneInto(colortex=albedo,
                                     depthtex=depth,
                                     auxtex=normal,
                                     auxbits=AuxBitplaneAttrib.ABOAuxNormal)

        lightQuad = self.lightMan.renderSceneInto(colortex=final)
        lightQuad.setShader(loader.loadShader("pass.cg"))
        lightQuad.setShaderInput("color", final)

        self.ambient.setShader(loader.loadShader("ambient.cg"))
        self.ambient.setShaderInput("albedo", albedo)

        self.ambient.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.ambient.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))

        self.lights.setShader(loader.loadShader("light.cg"))
        self.lights.setShaderInput("albedo", albedo)
        self.lights.setShaderInput("depth", depth)
        self.lights.setShaderInput("normal", normal)

        self.lights.setAttrib(
            ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OOne,
                                  ColorBlendAttrib.OOne))
        self.lights.setAttrib(
            CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise))
        self.lights.setAttrib(DepthWriteAttrib.make(DepthWriteAttrib.MOff))