Example #1
0
class HSunLamp(NodePath):
    def __init__(self,
                 name,
                 level,
                 rx=0,
                 ry=0,
                 rz=0,
                 x=0,
                 y=0,
                 z=0,
                 color=(1, 1, 1, 1),
                 affectAll=True,
                 showFrustum=False):
        self.name = name
        self.level = level
        self.lamp = DirectionalLight(name)
        NodePath.__init__(self, self.lamp)
        #self.attachNewNode(self.lamp)
        self.lamp.setColor(VBase4(color[0], color[1], color[2], color[3]))
        if affectAll:
            self.level.Base.render.setLight(self)
            self.reparentTo(self.level.Base.render)
        self.setPos(x, y, z)
        if showFrustum:
            self.lamp.showFrustum()
        self.setRotation(rx, ry, rz)

    def setRotation(self, x, y, z):
        pass
        p = 270 - x
        h = x
        r = y
Example #2
0
class NewSpaceCraft:
    def __init__(self, base, quality=0, sun_angle=0):

        self.base = base
        folder = base.params("space_craft_folder")
        self.model = base.loader.load_model(folder + "core.egg")
        self.wheel = base.loader.load_model(folder + "wheel.egg")
        self.sp = base.loader.load_model(folder + "solar_panel.egg")

        self.model.reparentTo(base.render)
        self.wheel.reparentTo(self.model)

        self.rest_pos = NodePath("rest_pos")
        self.rest_pos.reparent_to(self.model)
        self.rest_pos.set_pos(LVector3f(0.0, -0.75, -0.24))

        # self.wheel_lights = base.loader.load_model(folder + "wheel_lights.egg")
        # self.wheel_lights.set_color(1, 1, 0)
        # self.wheel_lights.reparentTo(self.wheel)
        # self.wheel_lights.setLightOff()

        # instanciating
        self.placeholders = []
        z1 = 0.4215
        z2 = 0.67935
        x1 = 1.136
        x2 = 2.6915
        for i, pos in enumerate(
            ((x1, 0, z1), (x2, 0, z1), (-x1, 0, z1), (-x2, 0, z1), (x1, 0, z2),
             (x2, 0, z2), (-x1, 0, z2), (-x2, 0, z2))):
            self.placeholders.append(self.model.attachNewNode("p" + str(i)))
            self.placeholders[-1].set_pos(pos)
            self.sp.instanceTo(self.placeholders[-1])

        # wheel spinning task
        self.spin_velocity = 0.01
        if self.spin_velocity > 0.:
            self.spin_task = self.wheel.hprInterval(duration=1 /
                                                    self.spin_velocity,
                                                    hpr=(360, 0, 0))
            self.spin_task.loop()

        # model light
        self.sun_light = DirectionalLight('SUN_LIGHT_ON_SPACE_CRAFT')
        self.sun_light.setColor((1., 1., 1., 1))
        self.sun_light_node = self.base.render.attachNewNode(self.sun_light)
        # self.sun_light_node.setHpr(-135, 0, 0)
        self.base.render.setLight(self.sun_light_node)

        if quality > 0:
            print(quality * 512)
            self.sun_light.setShadowCaster(True, quality * 512, quality * 512)

        # self.sun_light.getLens().setFilmSize(60., 40.)
        self.sun_light.getLens().setFilmSize(6., 4.)
        self.sun_light.getLens().setNearFar(2., 6.)
        self.sun_light_node.lookAt(NodePath(self.base.sun))
        self.sun_light_node.set_pos(0, 3.5, 1)
        self.sun_light_node.set_h(self.sun_light_node.get_h() + 180)

        # self.model.set_r(180)
        self.model.set_p(-90 + sun_angle)
        # self.model.set_h(180)

        self.model.set_bin('fixed', 10)

        self.set_solar_panel_angle(70)

        # self.show_shuttle_rest_pos()
        # self.model.set_depth_write(0)
        # self.model.set_depth_test(0)

    def set_hpr(self, h, p, r):
        self.model.set_hpr(h, p, r)

    def get_shuttle_rest_pos(self):
        return self.rest_pos.get_pos()

    def get_shuttle_rest_hpr(self):
        return self.rest_pos.get_hpr()

    def get_connection_pos_and_hpr(self):
        node = NodePath('test')
        node.set_pos(0, 0, 0)
        node.set_hpr(0, 90, 0)
        node.reparent_to(self.rest_pos)
        node.wrtReparentTo(self.base.render)
        return node.get_pos(), node.get_hpr()

    def connect_to_shuttle(self, node):
        node.set_pos(0, 0, 0)
        node.set_hpr(0, 90, 0)
        node.reparent_to(self.rest_pos)
        node.wrtReparentTo(self.base.render)

    def show_shuttle_rest_pos(self):
        arrow = Arrow(self.base)
        arrow.set_color(0.5, 0.5, 0)
        arrow.reparent_to(self.rest_pos)
        arrow.look_at(LVector3f(0, 0, 1))
        # l = Lamp(self.base, 'lamp', self.get_shuttle_rest_pos(), show_model=True)

    @staticmethod
    def get_shuttle_rest_direction():
        return LVector3f(1, 0, 0)

    def show_bounds(self):
        self.sun_light.showFrustum()
        for child in self.sun_light.getChildren():
            if child.name == "frustum":
                NodePath(child).setLightOff()
                NodePath(child).set_color(1, 1, 0, 1)
                NodePath(child).set_bin('fixed', 10)
        self.model.showTightBounds()

    def set_solar_panel_angle(self, angle):
        self.sp.set_p(angle)

    def solar_panel_increment(self, angle):
        self.sp.set_p(self.sp.get_p() + angle)
        print("sp :", self.sp.get_p())

    def spin(self, angle, value):
        if angle == 'p':
            self.model.set_p(self.model.get_p() + value)
        elif angle == 'h':
            self.model.set_h(self.model.get_h() + value)
        elif angle == 'r':
            self.model.set_r(self.model.get_r() + value)
        print(self.model.get_hpr())

    def move_solar_panels(self, new_angle=None):
        if new_angle is None:
            new_angle = 180 * random()
        if 0 <= new_angle <= 180:
            angle = self.sp.get_h()
            time = (new_angle - angle) * 0.1
            if time < 0:
                time = -time
            task = self.sp.hprInterval(duration=time, hpr=(0, new_angle, 0))
            task.start()

    def get_light(self):
        return self.sun_light_node