from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from math import pi
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import Point3, KeyboardButton, CollisionBox, CollisionSphere, CollisionNode, CollisionTraverser, \
    CollisionHandlerQueue

from panda3d.core import Vec3


class MyApp(ShowBase):
    def __init__(self):
        # -------------ЧТобы мы могли с движком
        ShowBase.__init__(self)  # Python брат , мы теперь иммед доступ к Panda3D
        self.doroga = self.loader.loadModel("models/doroga.obj")
        self.doroga.reparentTo(self.render)
        self.doroga.setScale(1400, 1600, 700)
        self.doroga.setPos(0, 159, 0)
        self.doroga.setHpr(180, 0, 0)



        self.tripoloski = self.loader.loadModel("models/tripoloski.obj")
        self.tripoloski.reparentTo(self.render)
        self.tripoloski.setScale(100, 100, 100)
        self.tripoloski.setPos(0, 0, 0)
        self.tripoloski.setHpr(180, 0, 0)

        self.durka = self.loader.loadModel("models/durka.obj")
        self.durka.reparentTo(self.render)
        self.durka.setScale(120, 100, 210)
        self.durka.setPos(-980, 0, 580)
        self.durka.setHpr(180, 0, 0)

        self.doroga = self.loader.loadModel("models/doroga.obj")
        self.doroga.reparentTo(self.render)
        self.doroga.setScale(1400, 1600, 2090)
        self.doroga.setPos(6100, 159, 0)
        self.doroga.setHpr(180, 0, 0)






        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(200, 0, 0)
        self.rubashka.setHpr(180, 0, 90)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(-500, 0, 450)
        self.rubashka.setHpr(180, 0, 90)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(-950, 0, 250)
        self.rubashka.setHpr(180, 0, 90)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(-1050, 0, 50)
        self.rubashka.setHpr(180, 0, 90)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(-1050, 0, 50)
        self.rubashka.setHpr(180, 0, 120)


        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(-1010, 0, 80)
        self.rubashka.setHpr(180, 0, 120)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(1010, 0, 80)
        self.rubashka.setHpr(180, 0, 120)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(1010, 0, -130)
        self.rubashka.setHpr(180, 0, 120)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(1350, 0, 210)
        self.rubashka.setHpr(180, 0, 120)

        self.durdom = self.loader.loadModel("barabulka/durdom.obj")
        self.durdom.reparentTo(self.render)
        self.durdom.setScale(880, 1200, 200)
        self.durdom.setPos(-1950, 0, 810)
        self.durdom.setHpr(180, 0, -110)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(1850, 0, 280)
        self.rubashka.setHpr(180, 0, 110)

        self.durka = self.loader.loadModel("models/durka.obj")
        self.durka.reparentTo(self.render)
        self.durka.setScale(120, 100, 210)
        self.durka.setPos(2980, 0, 180)
        self.durka.setHpr(180, 0, 0)

        self.rubashka = self.loader.loadModel("models/rubashka.obj")
        self.rubashka.reparentTo(self.render)
        self.rubashka.setScale(80, 120, 20)
        self.rubashka.setPos(2850, 0, 180)
        self.rubashka.setHpr(180, 0, 110)

        self.durka = self.loader.loadModel("models/durka.obj")
        self.durka.reparentTo(self.render)
        self.durka.setScale(120, 100, 210)
        self.durka.setPos(3980, 0, 180)
        self.durka.setHpr(180, 0, 0)


        #         #                                         повремя     до чего x y z  startPos старт
#         posInterval1 = self.PandaActor.posInterval(13, Point3(0, -10, 0),
#                                                    startPos=Point3(0, 10, 0))
#         posInterval2 = self.PandaActor.posInterval(13, Point3(0, 10, 0),
#                                                    startPos=Point3(0, -10, 0))
#         # ПЕРЕДАЕМ ПОРЯДОК
#         # self.PandaChekPoint = Sequence(posInterval1,posInterval2, name="PadaCheck")
#         # self.PandaChekPoint.loop()
#         # Define a procedure to move the camera.
#         # self.taskMgr.add(self.spinCameraTask, "Panda")
#         # self.taskMgr.add(self.PandaMove, "PandaMove")
#
         # УПРАВЛЕНИЕ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        self.tripoloski.setPos(0, -30, 100)
        self.x = 0
        self.y = -30
        self.z = 100
        self.keyMap = {
            "up": False,
            "down": False,
            "left": False,
            "right": False,
            "space": False

        }
#
        self.accept('w', self.updateKey, ["up", True])
        self.accept('w-up', self.updateKey, ["up", False])
        self.accept("s", self.updateKey, ["down", True])
        self.accept("s-up", self.updateKey, ["down", False])
        self.accept('a', self.updateKey, ["left", True])
        self.accept('a-up', self.updateKey, ["left", False])
        self.accept('d', self.updateKey, ["right", True])
        self.accept('d-up', self.updateKey, ["right", False])

        self.taskMgr.add(self.update, "update")
#
        def lalala(self,task):
            self.camera.setPos(self.tripoloski.getX(), self.tripoloski.getY() - 500, self.tripoloski.getZ() - 350)
            self.camera.lookAt(self.tripoloski)
            return task.cont
#
#         ############################################################################################
#         # Колизия - соприосновения
#         # Сфера
#         # х y z радиус
#         cs = CollisionSphere(0, 0, 150, 500)
#         box = CollisionBox(20, 20, 20, 500)
#         cnodepath2 = self.PandaActor.attachNewNode(CollisionNode('Oleg'))
#         cnodepath = self.PandaActor.attachNewNode(CollisionNode('Egor'))
#
#         cnodepath2.node().addSolid(box)  # колизия добавляет в панду бокс
#
#         cnodepath2.show()
#
#         cnodepath.node().addSolid(cs)  # колизия добавляет в панду сферу
#         cnodepath.show()
#         ###############################################################################################
#         # Обработка столкновений
#         levelCollider = self.level.attachNewNode(CollisionNode('LevelCollider'))  # невидимая коробка для панды
#         levelCollider.node().addSolid(
#             CollisionBox((-500, -500, 0), (500, 500, 10)))  # раземр коробочки (типо растянули)
#
#         levelCollider.show()
#
#         # Включим обработчик столкновения
#         self.cTrav = CollisionTraverser()  # обработчик столкновений - проверяет, сталкивается ли панда с чем-то
#         self.queue = CollisionHandlerQueue()  # сюда записываются столкноения, которые будут обнаружены ударом
#
#         self.cTrav.addCollider(cnodepath,
#                                self.queue)  # доавбляем нашу панду в обработчик, чтобы игра проверила стокновение
#
#         cnodepath.node().setIntoCollideMask(0)  # 0 - кто толкает, 1 - кто ждет толчка
#
#         cnodepath.node().setFromCollideMask(1)
#
#         levelCollider.node().setIntoCollideMask(1)  # коллизия уровня ждет столкновения, он терпила!
#
#         self.IsGround = False  # мы не на земеле
#
#         ###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#         self.taskMgr.add(self.checkCollision, "Col")
#

#
#     def checkCollision(self, task):
#
#         fps = task.time
#         if self.IsGround == True:
#             print("Типо стоит")
#             print("Тут типо нет действия падения")
#             print("Типо прыгать будет")
#         else:
#             print("Типо падает")
#             print("Тут типо он чето меняет !!!!")
#             self.PandaActor.setPos(self.PandaActor.getPos() + Vec3(0, 0, -0.1 * fps))
#         self.cTrav.traverse(self.render)
#
#         print(self.queue)
#         for entry in self.queue.getEntries():
#             name = entry.getIntoNodePath().getName()
#             if name == "LevelCollider":
#                 self.IsGround = True  # Стоклнулся дал переменной правду
#                 print("Типо если столкнулись , то типо меняет Isground на True")
#                 print("Панда стоклнулся с уровнем")
#
#         return task.cont
#
#     #########################################################################################################
#
    def updateKey(self, key, status):
        self.keyMap[key] = status
#
    def update(self, task):
         fps = task.time
         if self.keyMap["up"]:
             self.tripoloski.setPos(self.tripoloski.getPos() + Vec3(0, -0.8 * fps, 0))
         if self.keyMap["down"]:
             self.tripoloski.setPos(self.tripoloski.getPos() + Vec3(0, 0.8 * fps, 0))
         if self.keyMap["left"]:
             self.tripoloski.setPos(self.tripoloski.getPos() + Vec3(-0.8 * fps, 0, 0))
         if self.keyMap["right"]:
             self.tripoloski.setPos(self.tripoloski.getPos() + Vec3(0.8 * fps, 0, 0))
         return task.cont
#
#      задача это написать функцию в которой мы будем "прикреплены" к панде
#     def lalala(self, task):
#         self.camera.setPos(self.tripoloski.getX(), self.tripoloski.getY() - 15, self.tripoloski.getZ() + 10)
#         self.camera.lookAt(self.tripoloski)
#www         return Task.cont
#
#     # Дальше оформляйте на другие кнопки
#     def test(self):
#         self.x = self.x + 0.1
#         self.PandaActor.setPos(self.x, self.y, self.z)
#         # SetPos
#         # Сделать управление на все кнопки
#         print("Cобытие клавиша нажата W")
#
#     def PandaMove(self, task):
#         speed = task.time * 6.0
#         self.PandaActor.setPos(0, -speed, 0)
#         return Task.cont
#
#     def spinCameraTask(self, task):
#         angleDegrees = task.time * 6.0
#         angleRadians = angleDegrees * (pi / 180.0)
#         self.camera.setHpr(angleDegrees, 0, 0)
#         return task.cont
#
#
app = MyApp()
app.run()
