File: gltf_scenes.py

package info (click to toggle)
python-moderngl-window 2.4.2-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 69,260 kB
  • sloc: python: 11,225; makefile: 20
file content (98 lines) | stat: -rw-r--r-- 4,860 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from pathlib import Path
from pyrr import Matrix44

import moderngl
import moderngl_window as mglw
from moderngl_window.scene.camera import KeyboardCamera
from base import CameraWindow


class CubeModel(CameraWindow):
    """
    In oder for this example to work you need to clone the gltf
    model samples repository and ensure resource_dir is set correctly:
    https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0
    """
    title = 'GL Transmission Format (glTF) 2.0 Scene'
    window_size = 1280, 720
    aspect_ratio = None
    resource_dir = Path(__file__, '../../../glTF-Sample-Models/2.0').resolve()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.wnd.mouse_exclusivity = True

        # --- glTF-Sample-Models ---
        # self.scene = self.load_scene('2CylinderEngine/glTF-Binary/2CylinderEngine.glb')
        # self.scene = self.load_scene('CesiumMilkTruck/glTF-Embedded/CesiumMilkTruck.gltf')
        # self.scene = self.load_scene('CesiumMilkTruck/glTF-Binary/CesiumMilkTruck.glb')
        # self.scene = self.load_scene('CesiumMilkTruck/glTF/CesiumMilkTruck.gltf')
        self.scene = self.load_scene('Sponza/glTF/Sponza.gltf')
        # self.scene = self.load_scene('Lantern/glTF-Binary/Lantern.glb')
        # self.scene = self.load_scene('Buggy/glTF-Binary/Buggy.glb')
        # self.scene = self.load_scene('VC/glTF-Binary/VC.glb')
        # self.scene = self.load_scene('DamagedHelmet/glTF-Binary/DamagedHelmet.glb')
        # self.scene = self.load_scene('BoxInterleaved/glTF/BoxInterleaved.gltf')
        # self.scene = self.load_scene('OrientationTest/glTF/OrientationTest.gltf')
        # self.scene = self.load_scene('AntiqueCamera/glTF/AntiqueCamera.gltf')
        # self.scene = self.load_scene('BoomBox/glTF/BoomBox.gltf')
        # self.scene = self.load_scene('Box/glTF/Box.gltf')
        # self.scene = self.load_scene('BoxTextured/glTF/BoxTextured.gltf')
        # self.scene = self.load_scene('BoxTexturedNonPowerOfTwo/glTF/BoxTexturedNonPowerOfTwo.gltf')
        # self.scene = self.load_scene('BoxVertexColors/glTF/BoxVertexColors.gltf')
        # self.scene = self.load_scene('BrainStem/glTF/BrainStem.gltf')
        # self.scene = self.load_scene('Corset/glTF/Corset.gltf')
        # self.scene = self.load_scene('FlightHelmet/glTF/FlightHelmet.gltf')
        # self.scene = self.load_scene('Fox/glTF/Fox.gltf')
        # self.scene = self.load_scene('GearboxAssy/glTF/GearboxAssy.gltf')
        # self.scene = self.load_scene('ReciprocatingSaw/glTF/ReciprocatingSaw.gltf')
        # self.scene = self.load_scene('RiggedFigure/glTF/RiggedFigure.gltf')
        # self.scene = self.load_scene('RiggedSimple/glTF/RiggedSimple.gltf')
        # self.scene = self.load_scene('SciFiHelmet/glTF/SciFiHelmet.gltf')
        # self.scene = self.load_scene('SimpleMeshes/glTF/SimpleMeshes.gltf')
        # self.scene = self.load_scene('SimpleSparseAccessor/glTF/SimpleSparseAccessor.gltf')
        # self.scene = self.load_scene('Suzanne/glTF/Suzanne.gltf')
        # self.scene = self.load_scene('TextureCoordinateTest/glTF/TextureCoordinateTest.gltf')
        # self.scene = self.load_scene('TextureSettingsTest/glTF/TextureSettingsTest.gltf')
        # self.scene = self.load_scene('VertexColorTest/glTF/VertexColorTest.gltf')
        # self.scene = self.load_scene('WaterBottle/glTF/WaterBottle.gltf')

        self.camera = KeyboardCamera(self.wnd.keys, fov=75.0, aspect_ratio=self.wnd.aspect_ratio, near=0.1, far=1000.0)
        # self.camera.velocity = 7.0
        # self.camera.mouse_sensitivity = 0.3

        # Use this for gltf scenes for better camera controls
        if self.scene.diagonal_size > 0:
            self.camera.velocity = self.scene.diagonal_size / 5.0

    def render(self, time: float, frame_time: float):
        """Render the scene"""
        self.ctx.enable_only(moderngl.DEPTH_TEST | moderngl.CULL_FACE)

        # Move camera in on the z axis slightly by default
        translation = Matrix44.from_translation((0, 0, -1.5), dtype='f4')
        camera_matrix = self.camera.matrix * translation

        self.scene.draw(
            projection_matrix=self.camera.projection.matrix,
            camera_matrix=camera_matrix,
            time=time,
        )

        # Draw bounding boxes
        self.scene.draw_bbox(
            projection_matrix=self.camera.projection.matrix,
            camera_matrix=camera_matrix,
            children=True,
            color=(0.75, 0.75, 0.75),
        )

        # self.scene.draw_wireframe(
        #     projection_matrix=self.camera.projection.matrix,
        #     camera_matrix=camera_matrix,
        #     color=(1, 1, 1, 1),
        # )


if __name__ == '__main__':
    mglw.run_window_config(CubeModel)