def loadPlaneModel(self, modelname):
        """Loads models and animations from the planes directory."""
        animcontrols = {}
        model = loader.loadModel("planes/{0}/{0}".format(modelname))
        actor = Actor(model,
                      setFinal=True,
                      mergeLODBundles=True,
                      allowAsyncBind=False,
                      okMissing=False)
        #actor = Actor(model, lodNode="mid")

        subparts = (
            # subpart,       joints,                   animations
            ("Doors", ["Windscreen*", "Door*"], ("Open", "Close")),
            #("Landing Gear", ["Landing?Gear*", "LG*"], ("LG Out", "LG In")),
            ("Landing Gear", ["Landing?Gear*", "LG*"], ("LG Out", )),
            ("Ailerons", ["Aileron*"], ("Roll Left", "Roll Right")),
            ("Rudders", ["Rudder*"], ("Head Left", "Head Right")),
            ("Elevators", ["Elevator*"], ("Pitch Up", "Pitch Down")))

        for line in subparts:
            subpart, joints, anims = line
            actor.makeSubpart(subpart, joints)

            path = "planes/{0}/{0}-{{0}}".format(modelname)
            d = dict((anim, path.format(anim)) for anim in anims)

            #actor.loadAnims(d, subpart, "mid")
            actor.loadAnims(d, subpart)
            for anim in anims:
                #actor.bindAnim(anim, subpart, "mid")
                actor.bindAnim(anim, subpart)
                #animcontrols[anim] = actor.getAnimControls(anim, subpart,
                #                                           "mid", False)[0]
                animcontrols[anim] = actor.getAnimControls(
                    anim, subpart, None, False)[0]
        actor.makeSubpart("propellers", "Propeller*")
        actor.verifySubpartsComplete()
        actor.setSubpartsComplete(True)
        for p in actor.getJoints("propellers", "Propeller*", "lodRoot"):
            self.propellers.append(
                actor.controlJoint(None, "propellers", p.getName()))
        #actor.pprint()

        cams = model.findAllMatches("**/camera ?*")
        if not cams.isEmpty():
            cameras = actor.attachNewNode("cameras")
            cams.reparentTo(cameras)

        return actor, animcontrols
    def loadPlaneModel(self, modelname):
        """Loads models and animations from the planes directory."""
        animcontrols = {}
        model = loader.loadModel("planes/{0}/{0}".format(modelname))
        actor = Actor(model, setFinal=True, mergeLODBundles=True,
                      allowAsyncBind=False, okMissing=False)
        #actor = Actor(model, lodNode="mid")

        subparts = (
        # subpart,       joints,                   animations
        ("Doors",        ["Windscreen*", "Door*"], ("Open", "Close")),
        #("Landing Gear", ["Landing?Gear*", "LG*"], ("LG Out", "LG In")),
        ("Landing Gear", ["Landing?Gear*", "LG*"], ("LG Out",)),
        ("Ailerons",     ["Aileron*"],            ("Roll Left", "Roll Right")),
        ("Rudders",      ["Rudder*"],             ("Head Left", "Head Right")),
        ("Elevators",    ["Elevator*"],           ("Pitch Up", "Pitch Down"))
        )

        for line in subparts:
            subpart, joints, anims = line
            actor.makeSubpart(subpart, joints)

            path = "planes/{0}/{0}-{{0}}".format(modelname)
            d = dict((anim, path.format(anim)) for anim in anims)

            #actor.loadAnims(d, subpart, "mid")
            actor.loadAnims(d, subpart)
            for anim in anims:
                #actor.bindAnim(anim, subpart, "mid")
                actor.bindAnim(anim, subpart)
                #animcontrols[anim] = actor.getAnimControls(anim, subpart,
                #                                           "mid", False)[0]
                animcontrols[anim] = actor.getAnimControls(anim, subpart,
                                                               None, False)[0]
                
        actor.makeSubpart("propellers", "Propeller*")
        actor.verifySubpartsComplete()
        actor.setSubpartsComplete(True)
        for p in actor.getJoints("propellers", "Propeller*", "lodRoot"):
            self.propellers.append(actor.controlJoint(None, "propellers",
                                                                 p.getName()))
        #actor.pprint()

        cams = model.findAllMatches("**/camera ?*")
        if not cams.isEmpty():
            cameras = actor.attachNewNode("cameras")
            cams.reparentTo(cameras)

        return actor, animcontrols