from panda3d.core import NodePath
from panda3d.physics import *

class FallTest(NodePath):
    def __init__(self):
        NodePath.__init__(self, "FallTest")

    def setup(self):
        # Connect to Physics Manager:
        self.actorNode=ActorNode("FallTestActorNode")
        #self.actorNode.getPhysicsObject().setOriented(1)
        #self.actorNode.getPhysical(0).setViscosity(0.1)

        actorNodePath=self.attachNewNode(self.actorNode)
        #self.setPos(avatarNodePath, Vec3(0))
        #self.setHpr(avatarNodePath, Vec3(0))

        avatarNodePath=loader.loadModel("models/misc/smiley")
        assert not avatarNodePath.isEmpty()

        camLL=render.find("**/camLL")
        camLL.reparentTo(avatarNodePath)
        camLL.setPosHpr(0, -10, 0, 0, 0, 0)
        avatarNodePath.reparentTo(actorNodePath)
        #avatarNodePath.setPos(Vec3(0))
        #avatarNodePath.setHpr(Vec3(0))
        #avatarNodePath.assign(physicsActor)
        #self.phys=PhysicsManager()
        self.phys=base.physicsMgr

        if 1:
            fn=ForceNode("FallTest gravity")
            fnp=NodePath(fn)
            fnp.reparentTo(self)
            fnp.reparentTo(render)
            gravity=LinearVectorForce(0.0, 0.0, -.5)
            fn.addForce(gravity)
            self.phys.addLinearForce(gravity)
            self.gravity = gravity

        if 0:
            fn=ForceNode("FallTest viscosity")
            fnp=NodePath(fn)
            fnp.reparentTo(self)
            fnp.reparentTo(render)
            self.avatarViscosity=LinearFrictionForce(0.0, 1.0, 0)
            #self.avatarViscosity.setCoef(0.9)
            fn.addForce(self.avatarViscosity)
            self.phys.addLinearForce(self.avatarViscosity)

        if 0:
            self.phys.attachLinearIntegrator(LinearEulerIntegrator())
        if 0:
            self.phys.attachAngularIntegrator(AngularEulerIntegrator())
        #self.phys.attachPhysicalNode(self.node())
        self.phys.attachPhysicalNode(self.actorNode)

        if 0:
            self.momentumForce=LinearVectorForce(0.0, 0.0, 0.0)
            fn=ForceNode("FallTest momentum")
            fnp=NodePath(fn)
            fnp.reparentTo(render)
            fn.addForce(self.momentumForce)
            self.phys.addLinearForce(self.momentumForce)

        if 0:
            self.acForce=LinearVectorForce(0.0, 0.0, 0.0)
            fn=ForceNode("FallTest avatarControls")
            fnp=NodePath(fn)
            fnp.reparentTo(render)
            fn.addForce(self.acForce)
            self.phys.addLinearForce(self.acForce)
            #self.phys.removeLinearForce(self.acForce)
            #fnp.remove()

        #avatarNodePath.reparentTo(render)
        self.avatarNodePath = avatarNodePath
        #self.actorNode.getPhysicsObject().resetPosition(self.avatarNodePath.getPos())
        #self.actorNode.updateTransform()

if __name__ == "__main__":
    from direct.directbase.ThreeUpStart import *
    test=FallTest()
    test.reparentTo(base.render)
    test.setup()
    base.camera.setY(-10.0)
    base.run()
