def toggleAmbientOcclusion(self, checked):
		filters = CommonFilters(base.win, base.cam)
		
		if checked == True:
			filters.setAmbientOcclusion()
		else:
			filters.delAmbientOcclusion()
Exemple #2
0
    def __init__(self):
        BaseRenderer.__init__(self)  # <- important
        ShowBase.__init__(self)

        client = BulletClient(pb.DIRECT)
        client.setAdditionalSearchPath(pybullet_data.getDataPath())
        self.client = client

        # bind external renderer
        plugin = RenderingPlugin(client, self)

        # setup scene
        self.nodes = {}
        self.camLens.setNearFar(3, 7)
        self.camLens.setFilmSize(Vec2(0.030, 0.030))
        self.render.setAntialias(AntialiasAttrib.MAuto)
        self.render.setDepthOffset(1)
        self.render.setShaderAuto()
        self.setupScene(client)
        self.setupLights()

        # setup filters
        if args.ambient_occlusion:
            filters = CommonFilters(self.win, self.cam)
            filters.setAmbientOcclusion()

        # setup periodic tasks
        self.time = 0
        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
        self.taskMgr.add(self.stepSimulationTask, "StepSimulationTask")

        if args.debug:
            self.oobe()
    def toggleAmbientOcclusion(self, checked):
        filters = CommonFilters(base.win, base.cam)

        if checked == True:
            filters.setAmbientOcclusion()
        else:
            filters.delAmbientOcclusion()
Exemple #4
0
    def __init__(self):
        super().__init__(self)
        self.var1 = 0
        self.scene = loader.loadModel("models/world")
        playerTexture = loader.loadTexture("models/starfoxShip.jpg")
        self.player = self.scene.find("player")
        self.player.setTexture(playerTexture)

        base.setBackgroundColor(0.1, 0.1, 0.1, 1)
        enemyTexture = loader.loadTexture("models/enemyShip.jpg")
        self.enemy = self.scene.find("enemy1")
        self.enemy.setTexture(enemyTexture)

        self.basePlane = self.scene.find("basePlane")

        self.scene.reparentTo(self.render)
        self.player.setPos(50, 50, 3)
        self.enemy.setPos(50, 55, 0)

        self.ambient = AmbientLight("ambient")
        self.ambient.color = (0.1, 0.1, 0.1, 1)
        self.ambientPath = self.render.attachNewNode(self.ambient)
        render.setLight(self.ambientPath)

        self.dirLight = DirectionalLight("dir light")
        self.dirLight.color = (1, 1, 1, 1)
        self.dirLightPath = self.render.attachNewNode(self.dirLight)
        self.dirLightPath.setHpr(0, -90, 0)
        self.dirLight.setShadowCaster(True, 512, 512)
        render.setLight(self.dirLightPath)

        self.pointLight = PointLight("point light")
        self.pointLight.color = (1, 1, 1, 1)
        self.pointLightPath = self.render.attachNewNode(self.pointLight)
        self.pointLightPath.setPos(50, 52.5, 4)
        self.pointLight.attenuation = (.5, 0, 0)
        self.pointLight.setShadowCaster(True, 1024, 1024)
        self.render.setLight(self.pointLightPath)

        self.fog = Fog("fog")
        self.fog.setColor(0.1, 0.1, 0.1)
        self.fog.setExpDensity(.3)
        self.fog.setLinearRange(150, 300)
        self.fog.setLinearFallback(45, 160, 320)
        self.render.setFog(self.fog)

        self.render.setShaderAuto()
        self.render.setAntialias(AntialiasAttrib.MAuto)

        filters = CommonFilters(base.win, base.cam)
        filters.setBloom(size="large")
        filters.setAmbientOcclusion(strength=0.6, falloff=0.0005, radius=0.1)
        filters.setCartoonInk(separation=2, color=(0, 0, 0, 1))
        self.taskMgr.add(self.update, "update")
Exemple #5
0
class Filters():

    def __init__(self):
        self.filters = CommonFilters(base.win, base.cam)
        self.glowShader = loader.loadShader("./shaders/glowShader.sha")

    def enableFilters(self, player):
        #self.filters.setBloom(mintrigger=.35)
        self.filters.setBloom(blend=(1, 0, .2, 1), desat=-1, intensity=10, size="small")
        #self.filters.setCartoonInk(separation=-5)
        self.filters.setAmbientOcclusion(numsamples = 2, radius = 0.0025, amount = 2, strength = 0.001, falloff = 0.01)

        player.setShader(self.glowShader)
        player.setShaderInput("scale",4,4)

        path = render.find("renderDummy")

        path.setShader(self.glowShader)
        path.setShaderInput("scale",1,1,1)
Exemple #6
0
class Application(ShowBase, object):
    '''
	The default Application class which holds the code for
	Panda3D to run the game
	'''
    def __init__(self, quality):
        # Set the model quality, (super-low, low or high)
        self.quality = quality
        print("[>] PoultryGeist:\t      Setting Model Resolution to {}".format(
            self.quality.upper()))

        load_prc_file_data("", "win-size 1920 1080")

        # Run the standard Showbase init if running in super-low resolution mode
        # Do some stuff if the game is running at normal or high resolution
        if self.quality != 'super-low':
            # Construct and create the pipeline
            self.render_pipeline = RenderPipeline()
            self.render_pipeline.pre_showbase_init()
            super(Application, self).__init__()
            self.render_pipeline.create(self)
            # Enable anti-aliasing for the game
            render.setAntialias(AntialiasAttrib.MAuto)
            # Set the time pipeline lighting simulation time
            self.render_pipeline.daytime_mgr.time = "20:15"

        else:
            super(Application, self).__init__()
            # Enable the filter handler
            self.filters = CommonFilters(base.win, base.cam)
            self.filters.setAmbientOcclusion()

        # Enable particles and physics
        self.enableParticles()

        #Modify the Panda3D config on-the-fly
        #In this case, edit the window title
        load_prc_file_data(
            "", """window-title PoultryGeist
								  threading-model /Draw
								  multisamples 2
								  framebuffer-multisample 1
							   """)

        # Set the window size
        self.width, self.height = (800, 600)

        # Initialise the movement controller
        self.controller = None

        # Turn off normal mouse controls
        self.disableMouse()

        # Hide the cursor
        self.props = WindowProperties()
        #
        self.props.setCursorHidden(True)
        # Lower the FOV to make the game more difficult
        self.win.requestProperties(self.props)
        self.camLens.setFov(60)
        # Reduces the distance of which the camera can render objects close to it
        self.camLens.setNear(0.1)
        # Store and empty renderTree for later use
        self.emptyRenderTree = deepcopy(self.render)

        # Register the buttons for movement
        # TODO remove this and overhaul the button handling
        self.w_button = KeyboardButton.ascii_key('w'.encode())
        self.s_button = KeyboardButton.ascii_key('s'.encode())
        self.l_button = KeyboardButton.ascii_key('l'.encode())

        self.switch_button = KeyboardButton.ascii_key('p'.encode())

        # Initialise the SceneManager
        self.sceneMgr = SceneManager(self)

        # Initialise the collision traverser
        self.collisionTraverser = CollisionTraverser('main_traverser')
        base.cTrav = self.collisionTraverser
        base.cTrav.showCollisions(self.render)

        # Add the sceneMgr events to run as a task
        taskMgr.add(self.sceneMgr.runSceneTasks, "scene-tasks")

    def loadSettings(self, options):
        '''
		Iterate a dictionary of settings and apply them to the game
		'''
        # Toggle the audio based on the options
        if options.get('audio', 'on') == 'off':
            base.disableAllAudio()
        windowProperties = WindowProperties()
        # Set the resolution
        if options.get('resolution') == '720p':
            windowProperties.setSize(1280, 720)
            # Set the app width and height variables
            self.width, self.height = (1280, 720)
        else:
            windowProperties.setSize(1920, 1080)
            # Set the app width and height variables
            self.width, self.height = (1920, 1080)
        # Apply the properties to the window
        base.win.requestProperties(windowProperties)
        load_prc_file_data('', 'win-size {} {}'.format(self.width,
                                                       self.height))

    def move(self, forward, dir, elapsed):
        '''
		Move the camera forward or backwards
		For testing ONLY at the moment
		'''
        if forward:
            self.sceneMgr.focus += dir * elapsed * 30
        else:
            self.sceneMgr.focus -= dir * elapsed * 30
        # Set the position of the camera based on the direction
        self.camera.setPos(self.sceneMgr.focus - (dir * 5))

    def dumpTree(self):
        for a in self.render.getChildren():
            print(a)
Exemple #7
0
class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # Disable the camera trackball controls.
        self.disableMouse()

        # Load the environment model.
        self.environ = self.loader.loadModel("models/environment")
        # Reparent the model to render.
        self.environ.reparentTo(self.render)
        # Apply scale and position transforms on the model.
        self.environ.setScale(0.25, 0.25, 0.25)
        self.environ.setPos(-8, 42, 0)

        # Add the spinCameraTask procedure to the task manager.
        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")

        # Load and transform the panda actor.
        self.pandaActor = Actor(models="models/panda-model",
                                anims={"walk": "models/panda-walk4"})
        self.pandaActor.setScale(0.005, 0.005, 0.005)
        self.pandaActor.reparentTo(self.render)
        # Loop its animation.
        self.pandaActor.loop("walk")

        # Create the four lerp intervals needed for the panda to
        # walk back and forth.
        A = Point3(0, 10, 0)
        B = Point3(0, -10, 0)
        pandaPosInterval1 = self.pandaActor.posInterval(13, B, startPos=A)
        pandaPosInterval2 = self.pandaActor.posInterval(13, A, startPos=B)
        pandaHprInterval1 = self.pandaActor.hprInterval(3,
                                                        Point3(180, 0, 0),
                                                        startHpr=Point3(
                                                            0, 0, 0))
        pandaHprInterval2 = self.pandaActor.hprInterval(3,
                                                        Point3(0, 0, 0),
                                                        startHpr=Point3(
                                                            180, 0, 0))

        # Create and play the sequence that coordinates the intervals.
        self.pandaPace = Sequence(pandaPosInterval1,
                                  pandaHprInterval1,
                                  pandaPosInterval2,
                                  pandaHprInterval2,
                                  name="pandaPace")
        self.pandaPace.loop()

        self.teapot = self.loader.loadModel('models/teapot')

        self.teapot.reparentTo(self.render)
        self.console = Console(self)

        self.filters = CommonFilters(self.win, self.cam)
        self.filters.setCartoonInk()
        self.filters.setAmbientOcclusion()
        self.filters.setBloom()

    # Define a procedure to move the camera.
    def spinCameraTask(self, task):
        angleDegrees = task.time * 6.0
        angleRadians = angleDegrees * (pi / 180.0)
        self.camera.setPos(20 * sin(angleRadians), -20.0 * cos(angleRadians),
                           3)
        self.camera.setHpr(angleDegrees, 0, 0)
        return Task.cont
Exemple #8
0
class Landwalker(ShowBase):
    def __init__(self):
        #loadPrcFile("Config.prc")
        ShowBase.__init__(self)
        self.config = ConfigManager.loadSettings()

        #Config stuff here
        self.filters = CommonFilters(base.win, base.cam)
        self.AOEnabled = False
        self.bloomEnabled = False
        self.invertEnabled = False
        self.OSD = True
        self.shadersLoaded = False
        self.xray_mode = False
        self.show_model_bounds = False
        self.fogEnabled = True
        self.mouseEnabled = False

        #Store which keys are currently pressed
        self.keyMap = {
            "1": 0,
            "escape": 0,
            "left": 0,
            "right": 0,
            "forward": 0,
            "backward": 0,
            "cam-left": 0,
            "cam-right": 0,
        }

        self.ButtonImage = loader.loadModel(
            "phase_3/models/gui/quit_button.bam")
        self.introButtons()

    def introButtons(self):
        def loadGame():
            print("Loading game...")
            Button1.removeNode()
            Button2.removeNode()
            imageObject.destroy()
            self.loadGame()

        imageObject = OnscreenImage(image='stat_board.png', pos=(0, 0, 0))
        imageObject.setTransparency(TransparencyAttrib.MAlpha)

        Button1 = DirectButton(
            frameSize=None,
            text="Load Game",
            image=(self.ButtonImage.find('**/QuitBtn_UP'),
                   self.ButtonImage.find('**/QuitBtn_DN'),
                   self.ButtonImage.find('**/QuitBtn_RLVR')),
            relief=None,
            command=loadGame,
            text_pos=(0, -0.015),
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(-.85, -0, -.93),
            text_scale=0.059999999999999998,
            borderWidth=(0.015, 0.01),
            scale=.7)

        Button1.setPosHprScale(0.00, 0.00, 0.30, 0.00, 0.00, 0.00, 2.53, 2.53,
                               2.53)

        Button2 = DirectButton(
            frameSize=None,
            text="Customize",
            image=(self.ButtonImage.find('**/QuitBtn_UP'),
                   self.ButtonImage.find('**/QuitBtn_DN'),
                   self.ButtonImage.find('**/QuitBtn_RLVR')),
            relief=None,
            command=loadGame,
            text_pos=(0, -0.015),
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(-.85, -0, -.93),
            text_scale=0.059999999999999998,
            borderWidth=(0.015, 0.01),
            scale=.7)

        Button2.setPosHprScale(0.00, 0.00, -0.30, 0.00, 0.00, 0.00, 2.53, 2.53,
                               2.53)

    def loadGame(self):
        # Adding onscreen text here
        self.inst1 = addInstructions(0.06, "Press F to toggle wireframe")
        self.inst2 = addInstructions(0.12, "Press X to toggle xray")
        self.inst3 = addInstructions(0.18,
                                     "Press 1 to activate cartoon shading")
        self.inst4 = addInstructions(0.24,
                                     "Press 2 to deactivate cartoon shading")
        self.inst4 = addInstructions(0.30, "Press 3 to toggle fog")
        self.inst4 = addInstructions(0.36, "Press 4 to toggle free camera")
        self.inst4 = addInstructions(0.42, "Press 5 to toggle bloom")
        self.inst4 = addInstructions(0.48,
                                     "Press 6 to toggle Ambient Occlusion")
        self.inst4 = addInstructions(
            0.54, "Press Escape to toggle the onscreen debug")

        #Loading required modules...
        self.loadWorld()
        localAvatar = self.getActor()
        base.localAvatar = localAvatar
        self.LoadButtons()
        self.loadShaders()
        self.FogDensity = self.loadFog()

        self.objectList = list()
        self.objectList.append(self.scene)

        # Floater Object (For camera)
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(self.actorBody)
        self.floater.setY(-10)
        self.floater.setZ(8.5)
        self.floater.setHpr(0, -10, 0)

        # Set Camera
        self.camera.reparentTo(self.floater)

        # Accept the control keys for movement and rotation
        self.accept('f', self.toggleWireframe)
        self.accept('x', self.toggle_xray_mode)
        self.accept('b', self.toggle_model_bounds)
        self.accept("escape", self.toggle_osd)
        self.accept("1", self.loadCartoonShaders)
        self.accept("2", self.unloadShaders)
        self.accept("3", self.toggleFog)
        self.accept("4", self.toggleCamera)
        self.accept("5", self.toggleBloom)
        self.accept("6", self.toggleAmbientOcclusion)

        #warning: bright! self.accept("6", self.toggleInvert)

        self.accept("arrow_left", self.setKey, ["left", True])
        self.accept("arrow_right", self.setKey, ["right", True])
        self.accept("arrow_up", self.setKey, ["forward", True])
        self.accept("arrow_down", self.setKey, ["backward", True])
        self.accept("arrow_left-up", self.setKey, ["left", False])
        self.accept("arrow_right-up", self.setKey, ["right", False])
        self.accept("arrow_up-up", self.setKey, ["forward", False])
        self.accept("arrow_down-up", self.setKey, ["backward", False])

        self.taskMgr.add(self.move, "moveTask")

        self.offset = 3.2375

        wallBitmask = BitMask32(1)
        floorBitmask = BitMask32(2)
        base.cTrav = CollisionTraverser()

        walkControls = GravityWalker(legacyLifter=True)
        walkControls.setWallBitMask(wallBitmask)
        walkControls.setFloorBitMask(floorBitmask)
        walkControls.setWalkSpeed(16.0, 24.0, 8.0, 80.0)
        walkControls.initializeCollisions(base.cTrav,
                                          self.actorBody,
                                          floorOffset=0.025,
                                          reach=4.0)
        walkControls.setAirborneHeightFunc(self.getAirborneHeight())
        walkControls.enableAvatarControls()
        # self.controlManager.add(walkControls, 'walk')
        self.actorBody.physControls = walkControls

        localAvatar.physControls.placeOnFloor()
        # problem: onScreenDebug.enabled = self.toggle

        # print(updateOnScreenDebug.enabled)

        onScreenDebug.enabled = True
        base.setFrameRateMeter(True)
        PStatClient.connect()

        base.taskMgr.add(self.updateOnScreenDebug, 'UpdateOSD')

    def loadWorld(self):
        #Loading our Scene
        self.scene = loader.loadModel("models/world.egg.pz")
        self.scene.reparentTo(self.render)

        self.setBackgroundColor(0.53, 0.80, 0.92, 1)

    def removeWorld(self):
        self.scene.removeNode()

    def getActor(self):
        # Loading our Actor
        actorStartPos = self.scene.find("**/start_point").getPos()
        self.actorBody = ActorDict.playerBody
        self.actorBody.reparentTo(self.render)
        self.actorBody.loop('neutral')
        self.actorBody.setPos(actorStartPos + (0, 0, 1.5))
        self.actorBody.setScale(0.3)
        self.actorBody.setH(-180)

        def ActorHead():
            actorHead = loader.loadModel("custom/def_m.bam")
            actorHead.reparentTo(self.actorBody.find('**/to_head'))
            actorHead.setScale(0.20)
            actorHead.setZ(0)
            actorHead.setH(-180)

        ActorHead()
        return self.actorBody

    def LoadButtons(self):
        Button_Up = loader.loadModel(
            'phase_3/models/gui/quit_button.bam').find('**/QuitBtn_UP')
        Button_Down = loader.loadModel(
            'phase_3/models/gui/quit_button.bam').find('**/QuitBtn_DN')
        Button_Rlvr = loader.loadModel(
            'phase_3/models/gui/quit_button.bam').find('**/QuitBtn_RLVR')
        # https://pastebin.com/agdb8260

        Arrow_Up = loader.loadModel(
            'phase_3/models/gui/nameshop_gui.bam').find('**/triangleButtonUp')
        Arrow_Down = loader.loadModel(
            'phase_3/models/gui/nameshop_gui.bam').find('**/triangleButtonDwn')
        Arrow_Rlvr = loader.loadModel('phase_3/models/gui/nameshop_gui.bam'
                                      ).find('**/triangleButtonRllvr')
        Buttons = [Button_Up, Button_Down, Button_Rlvr]

        numItemsVisible = 4
        itemHeight = 0.11

        myScrolledList = DirectScrolledList(
            decButton_pos=(0.35, 0, 0.54),
            decButton_text_scale=0.04,
            decButton_relief=None,
            decButton_image=(Arrow_Up, Arrow_Down, Arrow_Rlvr),
            incButton_pos=(0.35, 0, -0.01),
            incButton_hpr=(0, 0, 180),
            incButton_text_scale=0.04,
            incButton_relief=None,
            incButton_image=(Arrow_Up, Arrow_Down, Arrow_Rlvr),
            pos=(0.74, 0, 0.4),
            numItemsVisible=numItemsVisible,
            forceHeight=itemHeight,
            itemFrame_pos=(0.35, 0, 0.43))

        modelArray = [
            'phase_4/models/neighborhoods/toontown_central.bam',
            'phase_13/models/parties/partyGrounds.bam', 'models/world.egg.pz',
            'custom/ship/ship.egg'
        ]
        nameArray = [
            'Toontown Central', 'Party Grounds', 'Default World', 'Ship Test'
        ]

        for index, name in enumerate(nameArray):
            l = DirectButton(text=name,
                             image=(Buttons),
                             extraArgs=[modelArray[index]],
                             command=self.spawnObject,
                             text_scale=0.045,
                             text_pos=(0, -0.007, 0),
                             relief=None)
            myScrolledList.addItem(l)

    #will be used to spawn objects
    def spawnObject(self, modelName):
        #if spawned object already exists, we're gonna need to remove it
        while len(self.objectList) >= 1:
            for world in self.objectList:
                world.removeNode()
            self.objectList.pop(0)

        spawnedObject = loader.loadModel(modelName)
        spawnedObject.reparentTo(render)
        spawnedObject.setPos(base.localAvatar.getPos())
        #spawnedObject = self.scene
        #self.removeWorld(self.objectList.find(spawnedObject))
        self.objectList.append(spawnedObject)
        print("Model Name: " + repr(modelName))
        print("Spawned Object: " + repr(spawnedObject))
        testobjectindex = len(self.objectList)
        print(testobjectindex)
        print(self.objectList)
        #self.removeWorld()

    def loadPStats(self):
        os.system("pstats.exe")

    def loadFog(self):
        self.fog = Fog('distanceFog')
        self.fog.setColor(0, 0, 0)
        self.fog.setExpDensity(.01)
        self.render.setFog(self.fog)
        self.fog.setOverallHidden(False)
        return self.fog.getExpDensity()

    def loadShaders(self):
        normalsBuffer = self.win.makeTextureBuffer("normalsBuffer", 0, 0)
        normalsBuffer.setClearColor(LVecBase4(0.5, 0.5, 0.5, 1))
        self.normalsBuffer = normalsBuffer
        normalsCamera = self.makeCamera(normalsBuffer,
                                        lens=self.cam.node().getLens())
        normalsCamera.node().setScene(self.render)

        drawnScene = self.normalsBuffer.getTextureCard()
        drawnScene.setTransparency(1)
        drawnScene.setColor(1, 1, 1, 0)
        drawnScene.reparentTo(self.render2d)
        self.drawnScene = drawnScene

    def toggleAmbientOcclusion(self):
        if not self.AOEnabled:
            self.filters.setAmbientOcclusion()
            self.AOEnabled = True
        else:
            self.filters.delAmbientOcclusion()
            self.AOEnabled = False

    def toggleInvert(self):
        if not self.invertEnabled:
            self.filters.setInverted()
            self.invertEnabled = True
        else:
            self.filters.delInverted()
            self.invertEnabled = False

    def toggleBloom(self):
        if not self.bloomEnabled:
            self.filters.setBloom()
            self.bloomEnabled = True
        else:
            self.filters.delBloom()
            self.bloomEnabled = False

    def toggleCamera(self):
        if not self.mouseEnabled:
            base.enableMouse()
            self.mouseEnabled = True
        else:
            base.disableMouse()
            self.camera.setPosHpr(0, 0, 0, 0, 0, 0)
            self.mouseEnabled = False

    def toggleFog(self):
        if not self.fogEnabled:
            self.fog.setExpDensity(self.FogDensity)
            self.fogEnabled = True
        else:
            self.fog.setExpDensity(0)
            self.fogEnabled = False

    def toggle_xray_mode(self):
        """Toggle X-ray mode on and off. This is useful for seeing the
        effectiveness of the portal culling."""
        self.xray_mode = not self.xray_mode
        if self.xray_mode:
            self.scene.setColorScale((1, 1, 1, 0.5))
            self.scene.setTransparency(TransparencyAttrib.MDual)
        else:
            self.scene.setColorScaleOff()
            self.scene.setTransparency(TransparencyAttrib.MNone)

    def toggle_model_bounds(self):
        """Toggle bounding volumes on and off on the models."""
        self.show_model_bounds = not self.show_model_bounds
        if self.show_model_bounds:
            for model in self.objectList:
                model.showBounds()
        else:
            for model in self.objectList:
                model.hideBounds()

    def toggle_osd(self):
        self.OSD = not self.OSD
        if self.OSD:
            self.onScreenDebug.enabled = True
        else:
            self.onScreenDebug.enabled = False

    def getAirborneHeight(self):
        return self.offset + 0.025000000000000001

    def updateOnScreenDebug(self, task):
        if (onScreenDebug.enabled):
            onScreenDebug.add('Avatar Position', base.localAvatar.getPos())
            onScreenDebug.add('Avatar Angle', base.localAvatar.getHpr())
            onScreenDebug.add('Camera Position', base.camera.getPos())
            onScreenDebug.add('Camera Angle', base.camera.getHpr())

        return Task.cont

    def unloadShaders(self):
        if self.shadersLoaded:
            self.drawnScene.hide()
            self.shadersLoaded = False

    def loadCartoonShaders(self):
        if not self.shadersLoaded:
            self.separation = 0.0015
            self.cutoff = 0.35
            inkGen = loader.loadShader("shaders/inkGen.sha")
            self.drawnScene.setShader(inkGen)
            self.drawnScene.setShaderInput(
                "separation", LVecBase4(self.separation, 0, self.separation,
                                        0))
            self.drawnScene.setShaderInput("cutoff", LVecBase4(self.cutoff))
            self.drawnScene.show()
            self.shadersLoaded = True

    # Records the state of the arrow keys
    def setKey(self, key, value):
        self.keyMap[key] = value

    # Accepts arrow keys to move either the player or the menu cursor,
    # Also deals with grid checking and collision detection
    def move(self, task):
        dt = globalClock.getDt()
        if self.keyMap["forward"]:
            self.localAvatar.setY(self.localAvatar, 20 * dt)
        elif self.keyMap["backward"]:
            self.localAvatar.setY(self.localAvatar, -20 * dt)
        if self.keyMap["left"]:
            self.localAvatar.setHpr(self.localAvatar.getH() + 1.5,
                                    self.localAvatar.getP(),
                                    self.localAvatar.getR())
        elif self.keyMap["right"]:
            self.localAvatar.setHpr(self.localAvatar.getH() - 1.5,
                                    self.localAvatar.getP(),
                                    self.localAvatar.getR())

        currentAnim = self.actorBody.getCurrentAnim()

        if self.keyMap["forward"]:
            if currentAnim != "walk":
                self.localAvatar.loop("walk")
        elif self.keyMap["backward"]:
            # Play the walk animation backwards.
            if currentAnim != "walk":
                self.localAvatar.loop("walk")
            self.localAvatar.setPlayRate(-1.0, "walk")
        elif self.keyMap["left"] or self.keyMap["right"]:
            if currentAnim != "walk":
                self.localAvatar.loop("walk")
            self.localAvatar.setPlayRate(1.0, "walk")
        else:
            if currentAnim is not None:
                self.localAvatar.stop()
                self.localAvatar.loop("neutral")
                self.isMoving = False

        return task.cont
Exemple #9
0
class ToontownShaderManager(DirectFrame):
    def __init__(self, parent):
        self._parent = parent
        DirectFrame.__init__(self,
                             parent=self._parent,
                             relief=None,
                             pos=(0.0, 0.0, 0.0),
                             scale=(1.0, 1.0, 1.0))
        self.filter = CommonFilters(base.win,
                                    base.cam)  # Only affects primary window

        # Ambient Occlusion
        self.samples = 0
        self.radius = 0.0
        self.amount = 0.0
        self.strength = 0.0

        # Blur/Sharpen
        self.blur = 1.0  # this is normal value, 0.0 blurs it

        # Cartoon Ink
        self.cartoonSep = 0.0
        self.cartoonR = 0.0
        self.cartoonB = 0.0
        self.cartoonG = 0.0

        # todo: Add bloom

        # Boolean Filters
        self.HDREnabled = False
        self.invertedEnabled = False
        self.sRGBEnabled = False
        self.halfPixelShiftEnabled = False
        self.viewGlowEnabled = False

        # Other Filters
        self.exposure = 0.0

        self.SAMPLES_MAX = 128
        self.RAD_MAX = 1.0
        self.AMT_MAX = 64.0
        self.STR_MAX = 0.01
        self.INCREMENT = 1
        self.numSamples = None
        self.numRadius = None

        self.circleModel = loader.loadModel(
            'phase_3/models/gui/tt_m_gui_mat_nameShop')
        self.barTexture = loader.loadTexture('phase_3/maps/slider.png')
        self.loadGUI()
        # self.newWindow() # Disabled for now

    def loadGUI(self):
        self.textRowHeight = 0.2
        self.buttonbase_xcoord = 1.4
        self.buttonbase_ycoord = 0.45
        self.loadAmbientOcclusionGUI()
        self.loadBlurGUI()
        self.loadExposureGUI()
        self.loadCartoonInkGUI()
        self.loadHotkeys()

    def loadHotkeys(self):
        # for now instead of gui buttons i'ma just put the bool filters as hotkeys
        self.accept('4', self.__toggleHDR)
        self.accept('5', self.__toggleInverted)
        self.accept('6', self.__toggleSRGB)
        self.accept('7', self.__toggleHalfPixelShift)
        self.accept('8', self.__toggleViewGlow)

    def loadAmbientOcclusionGUI(self):
        self.numSamples = DirectSlider(
            parent=self,
            value=self.samples,
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 self.buttonbase_ycoord - self.textRowHeight * 3.5),
            thumb_relief=None,
            range=(0, 32),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeAOValue)
        # command=self.__changeAOValue(self.samples, self.radius, self.amount, self.strength))
        self.numSamples.setScale(0.5)
        self.numSamples.setTransparency(True)
        self.numSamplesText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 3.2),
            scale=0.05,
            text="AO Sample Count = {}".format(self.samples),
            style=5,
            mayChange=True)

        self.numRadius = DirectSlider(
            parent=self,
            value=self.radius,
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 (self.buttonbase_ycoord - self.textRowHeight * 4.5)),
            thumb_relief=None,
            range=(0, 1),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeAOValue)

        self.numRadius.setScale(0.5)
        self.numRadius.setTransparency(True)
        self.numRadiusText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 4.2),
            scale=0.05,
            text="AO Radius = {}".format(str(self.radius)),
            style=5,
            mayChange=True)

        self.numAmount = DirectSlider(
            parent=self,
            value=self.amount,
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 (self.buttonbase_ycoord - self.textRowHeight * 5.5)),
            thumb_relief=None,
            range=(0, 64),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeAOValue)

        self.numAmount.setScale(0.5)
        self.numAmount.setTransparency(True)
        self.numAmountText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 5.2),
            scale=0.05,
            text="AO Amount = {}".format(self.amount),
            style=5,
            mayChange=True)

        self.numStrength = DirectSlider(
            parent=self,
            value=self.strength,
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 (self.buttonbase_ycoord - self.textRowHeight * 6.5)),
            thumb_relief=None,
            range=(0, 0.1),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeAOValue)

        self.numStrength.setScale(0.5)
        self.numStrength.setTransparency(True)
        self.numStrengthText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 6.2),
            scale=0.05,
            text="AO Strength = {}".format(self.strength),
            style=5,
            mayChange=True)

    def loadCartoonInkGUI(self):
        self.cSep = DirectSlider(
            parent=self,
            value=self.cartoonSep,
            pos=(-self.buttonbase_xcoord + 0.1, 0.0,
                 self.buttonbase_ycoord - self.textRowHeight * 2.5),
            thumb_relief=None,
            range=(0, 32),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeCartoon)
        # command=self.__changeAOValue(self.samples, self.radius, self.amount, self.strength))
        self.cSep.setScale(0.5)
        self.cSep.setTransparency(True)

        self.cRed = DirectSlider(
            parent=self,
            value=self.cartoonR,
            pos=(-self.buttonbase_xcoord + 0.1, 0.0,
                 self.buttonbase_ycoord - self.textRowHeight * 3.5),
            thumb_relief=None,
            range=(0, 1),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeCartoon)
        # command=self.__changeAOValue(self.samples, self.radius, self.amount, self.strength))
        self.cRed.setScale(0.5)
        self.cRed.setTransparency(True)

        self.cBlue = DirectSlider(
            parent=self,
            value=self.cartoonB,
            pos=(-self.buttonbase_xcoord + 0.1, 0.0,
                 self.buttonbase_ycoord - self.textRowHeight * 4.5),
            thumb_relief=None,
            range=(0, 1),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeCartoon)
        # command=self.__changeAOValue(self.samples, self.radius, self.amount, self.strength))
        self.cBlue.setScale(0.5)
        self.cBlue.setTransparency(True)

        self.cGreen = DirectSlider(
            parent=self,
            value=self.cartoonG,
            pos=(-self.buttonbase_xcoord + 0.1, 0.0,
                 self.buttonbase_ycoord - self.textRowHeight * 5.5),
            thumb_relief=None,
            range=(0, 1),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeCartoon)
        # command=self.__changeAOValue(self.samples, self.radius, self.amount, self.strength))
        self.cGreen.setScale(0.5)
        self.cGreen.setTransparency(True)

    def loadBlurGUI(self):
        self.numBlur = DirectSlider(
            parent=self,
            value=self.blur,
            # pos=(0.0, 0.0, 0.0), # for new window
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 (self.buttonbase_ycoord - self.textRowHeight * 0.5)),
            thumb_relief=None,
            range=(-10, 10),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeBlur)
        self.numBlur.setScale(0.5)
        self.numBlur.setTransparency(True)
        self.numBlurText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 0.2),
            scale=0.05,
            text="Blur Amount = {}".format(self.blur),
            style=5,
            mayChange=True)

    def loadExposureGUI(self):
        self.numExposure = DirectSlider(
            parent=self,
            value=self.exposure,
            pos=(self.buttonbase_xcoord + 0.1, 0.0,
                 (self.buttonbase_ycoord - self.textRowHeight * 2.2)),
            thumb_relief=None,
            range=(0, 5),  # self.SAMPLES_MAX
            thumb_geom=self.circleModel.find(
                '**/tt_t_gui_mat_namePanelCircle'),
            frameTexture=self.barTexture,
            frameSize=(-0.5, 0.5, -0.08, 0.08),
            command=self.__changeExposure)
        self.numExposure.setScale(0.5)
        self.numExposure.setTransparency(True)
        self.numExposureText = OnscreenText(
            pos=(self.buttonbase_xcoord + 0.1,
                 self.buttonbase_ycoord - self.textRowHeight * 1.9),
            scale=0.05,
            text="Exposure Amount = {}".format(self.blur),
            style=5,
            mayChange=True)

    def printValue(self):
        print(self.numSamples['value'])

    def __changeCartoon(self):
        self.filter.delCartoonInk()
        s = self.cSep['value']
        self.cartoonSep = s
        r = self.cRed['value']
        self.cartoonR = r
        b = self.cBlue['value']
        self.cartoonB = b
        g = self.cGreen['value']
        self.cartoonG = g
        self.filter.setCartoonInk(s, (r, g, b, 1))  # a doesn't change

    def __changeBlur(self):
        self.filter.delBlurSharpen()
        b = self.numBlur['value']
        self.blur = b
        self.numBlurText.setText("Blur amount = {}".format(b))
        self.filter.setBlurSharpen(b)

    def __changeAOValue(self):
        if self.numSamples is None:
            print("NONE")
            return
        self.filter.delAmbientOcclusion()

        s = self.numSamples['value']
        self.samples = s
        self.numSamplesText.setText("AO Sample Count = {}".format(s))
        if (s == 0):
            return

        r = self.numRadius['value']
        self.radius = r
        self.numRadiusText.setText("AO Radius = {}".format(r))
        if (r == 0):
            return

        a = self.numAmount['value']
        self.amount = a
        self.numAmountText.setText("AO Amount = {}".format(a))
        if (a == 0):
            return

        st = self.numStrength['value']
        self.strength = st
        self.numStrengthText.setText("AO Strength = {}".format(st))
        if (st == 0):
            return

        self.filter.setAmbientOcclusion(numsamples=s,
                                        radius=r,
                                        amount=a,
                                        strength=st)
        print(
            "sample count: {} | radius count: {} | amount count: {} | strength count: {}"
            .format(self.samples, self.radius, self.amount, self.strength))

    # WARNING: Won't work with relatively older Panda versions because this is new
    def __changeExposure(self):
        self.filter.delExposureAdjust()
        e = self.numExposure['value']
        self.exposure = e
        self.numExposureText.setText("Exposure amount = {}".format(e))
        self.filter.setExposureAdjust(e)

    def __toggleInverted(self):
        if not self.invertedEnabled:
            self.filter.setInverted()
            self.invertedEnabled = True
        else:
            self.filter.delInverted()
            self.invertedEnabled = False

    def __toggleHDR(self):
        if not self.HDREnabled:
            self.filter.setHighDynamicRange()
            self.HDREnabled = True
        else:
            self.filter.delHighDynamicRange()
            self.HDREnabled = False

    def __toggleSRGB(self):
        if not self.sRGBEnabled:
            self.filter.setSrgbEncode(True)
            self.sRGBEnabled = True
        else:
            self.filter.delSrgbEncode()
            self.sRGBEnabled = False

    def __toggleHalfPixelShift(self):
        if not self.halfPixelShiftEnabled:
            self.filter.setHalfPixelShift()
            self.halfPixelShiftEnabled = True
        else:
            self.filter.delHalfPixelShift()
            self.halfPixelShiftEnabled = False

    def __toggleViewGlow(self):
        if not self.viewGlowEnabled:
            self.filter.setViewGlow()
            self.viewGlowEnabled = True
        else:
            self.filter.delViewGlow()
            self.viewGlowEnabled = False

    def getValue(self, item, item_MAX):
        return item / item_MAX

    # Not gonna use this feature since it makes it very laggy. I will have to figure out
    # a better way to layout UI some other time.
    # https://discourse.panda3d.org/t/how-to-open-a-new-window/23929/4
    def newWindow(self):
        self.wp = WindowProperties()
        self.wp.setSize(700, 500)
        self.wp.setRawMice(True)
        print(self.wp.getMouseMode())
        win2mouseWatcher = MouseWatcher()
        ar = 1
        self.win2 = base.openWindow(props=self.wp, aspectRatio=ar)
        self.window2render2d = NodePath('window2render2d')
        self.window2render2d.setDepthTest(0)
        self.window2render2d.setDepthWrite(0)

        self.window2camera2d = base.makeCamera2d(self.win2)
        self.window2camera2d.reparentTo(self.window2render2d)

        # Parent gui to this
        self.window2aspect2d = self.window2render2d.attachNewNode(
            PGTop('window2aspect2d'))
        self.window2aspect2d.setScale(1.0 / ar, 1.0, 1.0)

        name = self.win2.getInputDeviceName(0)
        mk = base.dataRoot.attachNewNode(MouseAndKeyboard(self.win2, 0, name))
        mw = mk.attachNewNode(MouseWatcher(name))
        self.window2aspect2d.node().setMouseWatcher(mw.node())