예제 #1
0
 def delete(self):
     logger.info("Delete %s" % GetClassName(self))
     self.set_color_textures()
     self.set_depth_texture(None)
     glDeleteFramebuffers(1, [
         self.buffer,
     ])
예제 #2
0
 def initialize(self, core_manager):
     logger.info("initialize " + GetClassName(self))
     self.core_manager = core_manager
     self.resource_manager = core_manager.resource_manager
     self.scene_loader = self.resource_manager.scene_loader
     self.renderer = core_manager.renderer
     self.effect_manager = core_manager.effect_manager
예제 #3
0
파일: Model.py 프로젝트: idkwim/PyEngine3D
 def get_save_data(self):
     save_data = dict(
         object_type=GetClassName(self),
         mesh=self.mesh.name if self.mesh is not None else '',
         material_instances=[material_instance.name for material_instance in self.material_instances]
     )
     return save_data
예제 #4
0
    def initialize(self, core_manager, project_filename=""):
        self.core_manager = core_manager
        self.scene_manager = core_manager.scene_manager
        self.resource_manager = core_manager.resource_manager

        # default project
        if project_filename == "":
            project_filename = self.resource_manager.DefaultProjectFile
        else:
            project_filename = os.path.relpath(project_filename, ".")

        logger.info("initialize %s : %s" %
                    (GetClassName(self), project_filename))
        try:
            self.next_open_project_filename = ""
            self.project_name = os.path.splitext(
                os.path.split(project_filename)[1])[0]
            self.project_dir = os.path.split(project_filename)[0]
            self.project_filename = project_filename
            self.config = Config(project_filename, log_level)

            # set default config
            self.config.setDefaultValue("Screen", "size", [1280, 720])
            self.config.setDefaultValue("Screen", "full_screen", False)
            meter_per_unit = 1.0  # 1 unit = 1 m
            self.config.setDefaultValue("Camera", "meter_per_unit",
                                        meter_per_unit)
            self.config.setDefaultValue("Camera", "near",
                                        0.1 / meter_per_unit)  # 10 cm
            self.config.setDefaultValue("Camera", "far",
                                        2000.0 / meter_per_unit)  # 2 km
            self.config.setDefaultValue("Camera", "fov", 60)
            self.config.setDefaultValue("Camera", "move_speed", meter_per_unit)
            self.config.setDefaultValue("Camera", "pan_speed", meter_per_unit)
            self.config.setDefaultValue("Camera", "rotation_speed", 0.3)
        except BaseException:
            logger.info("Cannot open %s : %s" %
                        (GetClassName(self), project_filename))
            return False
        return True
예제 #5
0
    def add_object(self, **object_data):
        model = object_data.get('model')
        if model:
            object_data['name'] = self.generate_object_name(object_data.get('name', model.name))
            objType = GetClassName(model)
            logger.info("add %s : %s" % (objType, object_data['name']))

            if model.mesh and model.mesh.has_bone():
                obj_instance = SkeletonActor(**object_data)
            else:
                obj_instance = StaticActor(**object_data)
            # regist
            self.regist_object(obj_instance)
            return obj_instance
        return None
예제 #6
0
    def exit(self):
        # send a message to close ui
        if self.uiCmdQueue:
            self.uiCmdQueue.put(COMMAND.CLOSE_UI)

        # write config
        if self.valid:
            self.config.setValue("Project", "recent",
                                 self.project_manager.project_filename)
            self.config.setValue("Project", "game_backend",
                                 self.last_game_backend)
            self.config.save()  # save config

        # save project
        self.project_manager.close_project()
        self.renderer.close()
        self.resource_manager.close()
        self.game_backend.quit()

        logger.info("Process Stop : %s" % GetClassName(self))  # process stop
예제 #7
0
 def __init__(self):
     logger.info("Create " + GetClassName(self))
     self.buffer = glGenFramebuffers(1)
     self.max_draw_buffers = glGetInteger(GL_MAX_DRAW_BUFFERS)
     self.color_textures = [
         None,
     ] * self.max_draw_buffers
     self.attach_count = 0
     self.attachments = [
         0,
     ] * self.max_draw_buffers
     self.depth_texture = None
     self.width = 0
     self.height = 0
     self.viewport_width = 0
     self.viewport_height = 0
     self.viewport_scale = 1.0
     self.commands = []
     self.target_face = GL_TEXTURE_CUBE_MAP_POSITIVE_X  # cubemap face
     self.target_layer = 0  # 3d texture layer
     self.target_level = 0  # mipmap level
예제 #8
0
 def delete(self):
     logger.info("Delete %s : %s" % (GetClassName(self), self.name))
     glDeleteTextures([self.buffer, ])
     self.buffer = -1
예제 #9
0
    def create_texture(self, **texture_data):
        if self.buffer != -1:
            self.delete()

        self.attachment = False
        self.image_mode = texture_data.get('image_mode')
        self.internal_format = texture_data.get('internal_format')
        self.texture_format = texture_data.get('texture_format')
        self.sRGB = texture_data.get('sRGB', False)
        self.clear_color = texture_data.get('clear_color')
        self.multisample_count = 0

        if self.internal_format is None and self.image_mode:
            self.internal_format = get_internal_format(self.image_mode)
        if self.texture_format is None and self.image_mode:
            self.texture_format = get_texture_format(self.image_mode)
        if self.image_mode is None and self.texture_format:
            self.image_mode = get_image_mode(self.texture_format)

        # Convert to sRGB
        if self.sRGB:
            if self.internal_format == GL_RGB:
                self.internal_format = GL_SRGB8
            elif self.internal_format == GL_RGBA:
                self.internal_format = GL_SRGB8_ALPHA8

        if GL_RGBA == self.internal_format:
            self.internal_format = GL_RGBA8
        if GL_RGB == self.internal_format:
            self.internal_format = GL_RGB8

        self.width = int(texture_data.get('width', 0))
        self.height = int(texture_data.get('height', 0))
        self.depth = int(max(1, texture_data.get('depth', 1)))
        self.data_type = texture_data.get('data_type', GL_UNSIGNED_BYTE)
        self.min_filter = texture_data.get('min_filter', GL_LINEAR_MIPMAP_LINEAR)
        self.mag_filter = texture_data.get('mag_filter', GL_LINEAR)  # GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_NEAREST

        mipmap_filters = (GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST,
                          GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST_MIPMAP_NEAREST)
        self.enable_mipmap = self.min_filter in mipmap_filters
        if self.target == GL_TEXTURE_2D_MULTISAMPLE:
            self.enable_mipmap = False

        self.wrap = texture_data.get('wrap', self.default_wrap)  # GL_REPEAT, GL_CLAMP
        self.wrap_s = texture_data.get('wrap_s')
        self.wrap_t = texture_data.get('wrap_t')
        self.wrap_r = texture_data.get('wrap_r')
        self.buffer = -1
        self.sampler_handle = -1

        # texture parameter overwrite
        # self.sampler_handle = glGenSamplers(1)
        # glSamplerParameteri(self.sampler_handle, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
        # glBindSampler(0, self.sampler_handle)

        logger.info("Create %s : %s %dx%dx%d %s mipmap(%s)." % (
            GetClassName(self), self.name, self.width, self.height, self.depth, str(self.internal_format),
            'Enable' if self.enable_mipmap else 'Disable'))

        self.attribute = Attributes()
예제 #10
0
    def initialize(self, cmdQueue, uiCmdQueue, cmdPipe, project_filename=""):
        # process start
        logger.info('Platform : %s' % platformModule.platform())
        logger.info("Process Start : %s" % GetClassName(self))

        self.cmdQueue = cmdQueue
        self.uiCmdQueue = uiCmdQueue
        self.cmdPipe = cmdPipe

        self.config = Config("config.ini", log_level)

        self.regist_command()

        # ready to launch - send message to ui
        if self.cmdPipe:
            self.cmdPipe.SendAndRecv(COMMAND.UI_RUN, None, COMMAND.UI_RUN_OK,
                                     None)

        from PyEngine3D.UI import ViewportManager
        from PyEngine3D.OpenGLContext import OpenGLContext
        from PyEngine3D.ResourceManager import ResourceManager
        from PyEngine3D.Render import Renderer, RenderTargetManager, FontManager, RenderOptionManager, EffectManager
        from .SceneManager import SceneManager
        from .ProjectManager import ProjectManager

        self.opengl_context = OpenGLContext
        self.viewport_manager = ViewportManager.instance()
        self.render_option_manager = RenderOptionManager.instance()
        self.rendertarget_manager = RenderTargetManager.instance()
        self.resource_manager = ResourceManager.instance()
        self.font_manager = FontManager.instance()
        self.renderer = Renderer.instance()
        self.scene_manager = SceneManager.instance()
        self.effect_manager = EffectManager.instance()
        self.project_manager = ProjectManager.instance()

        # check invalid project
        if not self.project_manager.initialize(self, project_filename):
            self.valid = False
            self.exit()
            return False

        # do First than other manager initalize. Because have to been opengl init from pygame.display.set_mode
        width, height = self.project_manager.config.Screen.size
        full_screen = self.project_manager.config.Screen.full_screen

        if self.config.hasValue('Project', 'game_backend'):
            self.last_game_backend = self.config.getValue(
                'Project', 'game_backend')

        self.last_game_backend = self.last_game_backend.lower()

        def run_pygame():
            from .GameBackend import GameBackend_pygame
            self.game_backend = GameBackend_pygame.PyGame(self)
            self.last_game_backend = GameBackNames.PYGAME

        def run_pyglet():
            from .GameBackend import GameBackend_pyglet
            self.game_backend = GameBackend_pyglet.PyGlet(self)
            self.last_game_backend = GameBackNames.PYGLET

        # try 2 times.
        for i in range(2):
            if self.last_game_backend == GameBackNames.PYGAME:
                try:
                    run_pygame()
                    break
                except:
                    logger.error(
                        "The pygame library does not exist and execution failed. Run again with the pyglet."
                    )
                    self.last_game_backend = GameBackNames.PYGLET
            else:
                try:
                    run_pyglet()
                    break
                except:
                    logger.error(
                        "The pyglet library does not exist and execution failed. Run again with the pygame."
                    )
                    self.last_game_backend = GameBackNames.PYGAME
        else:
            logger.error(
                'PyGame or PyGlet is required. Please run "pip install -r requirements.txt" and try again.'
            )
            # send a message to close ui
            if self.uiCmdQueue:
                self.uiCmdQueue.put(COMMAND.CLOSE_UI)
            return False

        self.game_backend.create_window(width, height, full_screen)
        self.opengl_context.initialize()
        self.send_game_backend_list(self.game_backend_list)
        index = self.game_backend_list.index(
            self.last_game_backend
        ) if self.last_game_backend in self.game_backend_list else 0
        self.send_current_game_backend_index(index)

        if not self.game_backend.valid:
            self.error('game_backend initializing failed')

        # initialize managers
        self.resource_manager.initialize(self,
                                         self.project_manager.project_dir)
        self.viewport_manager.initialize(self)
        self.render_option_manager.initialize(self)
        self.rendertarget_manager.initialize(self)
        self.font_manager.initialize(self)
        self.renderer.initialize(self)
        self.effect_manager.initialize(self)
        self.scene_manager.initialize(self)

        self.viewport_manager.build_ui()

        self.script_manager = None
        # self.load_script_manager(reload=False)

        # new scene
        self.game_backend.reset_screen()
        self.scene_manager.new_scene()

        self.send(COMMAND.SORT_UI_ITEMS)
        return True
예제 #11
0
 def send_object_info(self, obj):
     object_name = obj.name if hasattr(obj, 'name') else str(obj)
     object_class_name = GetClassName(obj)
     self.send(COMMAND.TRANS_OBJECT_INFO, (object_name, object_class_name))
예제 #12
0
 def delete(self):
     logger.info("Delete %s : %s" % (GetClassName(self), self.name))
     glDeleteRenderbuffers(1, [
         self.buffer,
     ])
     self.buffer = -1
예제 #13
0
 def __init__(self, shader_name, shader_code):
     logger.info("Load " + GetClassName(self) + " : " + shader_name)
     self.name = shader_name
     self.shader_code = shader_code
     self.include_files = []
     self.attribute = Attributes()