Esempio n. 1
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.camera.projection.update(near=1, far=200)
        self.wnd.mouse_exclusivity = True

        # Offscreen buffer
        offscreen_size = 1024, 1024
        self.offscreen_depth = self.ctx.depth_texture(offscreen_size)
        self.offscreen_depth.compare_func = ''
        self.offscreen_depth.repeat_x = False
        self.offscreen_depth.repeat_y = False
        self.offscreen_color = self.ctx.texture(offscreen_size, 4)

        self.offscreen = self.ctx.framebuffer(
            color_attachments=[self.offscreen_color],
            depth_attachment=self.offscreen_depth,
        )

        # Scene geometry
        self.floor = geometry.cube(size=(25.0, 1.0, 25.0))
        self.wall = geometry.cube(size=(1.0, 5, 25), center=(-12.5, 2, 0))
        self.another_blob = geometry.cube(size=(5, 5, 5), center=(-7, -10, 0))
        self.sphere = geometry.sphere(radius=5.0, sectors=64, rings=32)
        self.sun = geometry.sphere(radius=1.0)

        # Programs
        self.basic_light = self.load_program(
            'programs/shadow_mapping/directional_light.glsl')
        self.basic_light['shadowMap'].value = 0
        self.basic_light['color'].value = 1.0, 1.0, 1.0, 1.0
        self.shadowmap_program = self.load_program(
            'programs/shadow_mapping/shadowmap.glsl')
        self.sun_prog = self.load_program('programs/cube_simple.glsl')
        self.sun_prog['color'].value = 1, 1, 0, 1
        self.lightpos = 0, 0, 0
Esempio n. 2
0
    def __init__(self, ctx, color):
        super().__init__(ctx, color,
                         "programs/shadow_mapping/directional_light.glsl")

        self.meshes = [
            geometry.cube(size=np.array((7, 5, 1)) / 2, center=(0, 0, -1)),
            geometry.cube(size=np.array((2, 2, 1)) / 2, center=(0, 0, 1)),
        ]
Esempio n. 3
0
 def __init__(self, ctx, color, center_offs=(0, 0, 0)):
     super().__init__(ctx, color,
                      "programs/shadow_mapping/directional_light.glsl")
     thicc = 0.4
     self.center_offs = center_offs
     self.meshes = [
         geometry.cube(size=(0, 0, 1), center=(0, 0, 0)),
         geometry.cube(size=(0, 0, 1), center=(0, 0, 0)),
         geometry.cube(size=(0, 0, 1), center=(0, 0, 0)),
     ]
Esempio n. 4
0
    def __init__(self, *, ctx: moderngl.Context, size: Tuple[int, int, int]):
        self.ctx = ctx
        self._size = size

        # Create lookup texture for active blocks
        # NOTE: We allocate room for 100 x 100 x 100 for now
        #       100 x 100 x 100 = 1_000_000 fragments
        #       1000 x 1000 = 1_000_000 fragments
        #       We store several 100 x 100 layers respersting one slice in voxel
        self.voxel_lookup = self.ctx.texture((1000, 1000), 1, dtype='f1')
        self.voxel_lookup.filter = moderngl.NEAREST, moderngl.NEAREST
        self.voxel_lookup.repeat_x = False
        self.voxel_lookup.repeat_y = False
        # Write in some default data
        for i in range(100):
            self.fill_layer(i, 255)

        # Construct the per-instance data for active cubes using a transform
        self.instance_data = ctx.buffer(reserve=self.max_cubes * 4 * 3)

        self.quad_fs = geometry.quad_fs()
        self.gen_instance_vao = None

        self._num_instances = 0
        self._query = self.ctx.query(primitives=True)

        self.cube = geometry.cube()
        self.cube.buffer(self.instance_data, "3f/i", ["in_offset"])
        # Filled externally
        self.texture_prog = None
        self.gen_instance_prog = None
        self.voxel_light_prog = None
        self.voxel_wireframe_prog = None
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.wnd.mouse_exclusivity = True
        self.camera.projection.update(near=1, far=1000)
        self.cube = geometry.cube(size=(2, 2, 2))
        self.prog = self.load_program('programs/cube_simple_instanced.glsl')
        self.prog['m_proj'].write(self.camera.projection.matrix)
        self.prog['m_model'].write(Matrix44.identity(dtype='f4'))

        # Generate per instance data represeting a grid of cubes
        N = 100
        self.instances = N * N

        def gen_data(x_res, z_res, spacing=2.5):
            """Generates a grid of N * N poistions and random colors on the xz plane"""
            for y in range(z_res):
                for x in range(x_res):
                    yield -N * spacing / 2 + spacing * x
                    yield 0
                    yield -N * spacing / 2 + spacing * y
                    yield numpy.random.uniform(0, 1)
                    yield numpy.random.uniform(0, 1)
                    yield numpy.random.uniform(0, 1)

        self.instance_data = self.ctx.buffer(numpy.fromiter(gen_data(N, N), 'f4', count=self.instances * 6))
        self.cube.buffer(self.instance_data, '3f 3f/i', ['in_offset', 'in_color'])
Esempio n. 6
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        if self.wnd.name != 'pygame2':
            raise RuntimeError(
                'This example only works with --window pygame2 option')

        self.pg_res = (160, 160)
        # Create a 24bit (rgba) offscreen surface pygame can render to
        self.pg_screen = pygame.Surface(self.pg_res, flags=pygame.SRCALPHA)
        # 24 bit (rgba) moderngl texture
        self.pg_texture = self.ctx.texture(self.pg_res, 4)
        self.pg_texture.filter = moderngl.NEAREST, moderngl.NEAREST

        # Simple geometry and shader to render
        self.cube = geometry.cube(size=(2.0, 2.0, 2.0))
        self.texture_prog = self.load_program(
            'programs/cube_simple_texture.glsl')
        self.texture_prog['m_proj'].write(
            matrix44.create_perspective_projection(60,
                                                   self.wnd.aspect_ratio,
                                                   1,
                                                   100,
                                                   dtype='f4'))
        self.texture_prog['m_model'].write(
            matrix44.create_identity(dtype='f4'))
Esempio n. 7
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.cube = geometry.cube(size=(2, 2, 2))
     self.texture = self.load_texture_array('textures/array.png',
                                            layers=10,
                                            mipmap=True,
                                            anisotrpy=8.0)
     self.prog = self.load_program('programs/cube_texture_array.glsl')
Esempio n. 8
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        # do initialization here
        self.cube = geometry.cube()
        self.prog = self.load_program('programs/cube.glsl')
        self.texture = self.load_texture_array(
            'textures/pattern.jpg', layers=2, mipmap=True, anisotropy=8.0)
        self.prog['texture0'].value = 0
        self.prog['layers'].value = 10
        self.rotation = self.prog['rotation']
Esempio n. 9
0
    def test_cube(self):
        """Create a cube"""
        mesh = geometry.cube(size=(1.0, 1.0, 1.0), name="test_cube")
        self.assertEqual(mesh.name, "test_cube")
        self.assertIsInstance(mesh.get_buffer_by_name(AttributeNames.POSITION),
                              BufferInfo)
        self.assertIsInstance(mesh.get_buffer_by_name(AttributeNames.NORMAL),
                              BufferInfo)
        self.assertIsInstance(
            mesh.get_buffer_by_name(AttributeNames.TEXCOORD_0), BufferInfo)

        # Use custom buffer/attribute names
        mesh = geometry.cube(size=(1.0, 1.0, 1.0),
                             name="test_cube",
                             attr_names=self.custom_attrs)
        self.assertIsInstance(
            mesh.get_buffer_by_name(self.custom_attrs.POSITION), BufferInfo)
        self.assertIsInstance(
            mesh.get_buffer_by_name(self.custom_attrs.NORMAL), BufferInfo)
        self.assertIsInstance(
            mesh.get_buffer_by_name(self.custom_attrs.TEXCOORD_0), BufferInfo)
Esempio n. 10
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.wnd.mouse_exclusivity = True
     self.num_layers = 10
     self.cube = geometry.cube(size=(2, 2, 2))
     self.texture = self.load_texture_array('textures/array.png',
                                            layers=self.num_layers,
                                            mipmap=True,
                                            anisotrpy=8.0)
     self.prog = self.load_program('programs/cube_texture_array.glsl')
     self.prog['texture0'].value = 0
     self.prog['num_layers'].value = 10
Esempio n. 11
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        imgui.create_context()
        self.wnd.ctx.error
        self.imgui = ModernglWindowRenderer(self.wnd)

        self.cube = geometry.cube(size=(2, 2, 2))
        self.prog = self.load_program('programs/cube_simple.glsl')
        self.prog['color'].value = (1.0, 1.0, 1.0, 1.0)
        self.prog['m_camera'].write(Matrix44.identity(dtype='f4'))
        self.prog['m_proj'].write(Matrix44.perspective_projection(75, self.wnd.aspect_ratio, 1, 100, dtype='f4'))
        self.slider_value = 88
Esempio n. 12
0
    def update_vel(self, vel):
        vel = np.array(vel)
        ident = np.eye(3)

        a = (vel >= 0).astype(int)
        b = -(vel < 0).astype(int)

        c = a + b

        sizes = c * ident * vel + ((1 - ident) / 5)
        centers = ident * (-vel / 2) + self.center_offs

        temp = [
            geometry.cube(size=sizes[0], center=centers[0]),
            geometry.cube(size=sizes[1], center=centers[1]),
            geometry.cube(size=sizes[2], center=centers[2]),
        ]
        for i in range(len(self.meshes)):
            self.meshes[i].release()

        self.meshes = temp
Esempio n. 13
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.wnd.mouse_exclusivity = True
     self.cube = geometry.cube(size=(20, 20, 20))
     self.texture = self.load_texture_cube(
         neg_x='textures/cubemaps/yokohama/negx.jpg',
         neg_y='textures/cubemaps/yokohama/negy.jpg',
         neg_z='textures/cubemaps/yokohama/negz.jpg',
         pos_x='textures/cubemaps/yokohama/posx.jpg',
         pos_y='textures/cubemaps/yokohama/posy.jpg',
         pos_z='textures/cubemaps/yokohama/posz.jpg',
     )
     self.prog = self.load_program('programs/cubemap.glsl')
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.camera.projection.update(near=1, far=200)
        self.wnd.mouse_exclusivity = True

        # Offscreen buffer
        offscreen_size = 1024, 1024
        self.offscreen_depth = self.ctx.depth_texture(offscreen_size)
        self.offscreen_depth.compare_func = ''
        self.offscreen_depth.repeat_x = False
        self.offscreen_depth.repeat_y = False
        # Less ugly by default with linear. May need to be NEAREST for some techniques
        self.offscreen_depth.filter = moderngl.LINEAR, moderngl.LINEAR

        self.offscreen = self.ctx.framebuffer(
            depth_attachment=self.offscreen_depth,
        )

        # Scene geometry
        self.floor = geometry.cube(size=(25.0, 1.0, 25.0))
        self.wall = geometry.cube(size=(1.0, 5, 25), center=(-12.5, 2, 0))
        self.sphere = geometry.sphere(radius=5.0, sectors=64, rings=32)
        self.sun = geometry.sphere(radius=1.0)

        # Debug geometry
        self.offscreen_quad = geometry.quad_2d(size=(0.5, 0.5), pos=(0.75, 0.75))
        self.offscreen_quad2 = geometry.quad_2d(size=(0.5, 0.5), pos=(0.25, 0.75))

        # Programs
        self.raw_depth_prog = self.load_program('programs/shadow_mapping/raw_depth.glsl')
        self.basic_light = self.load_program('programs/shadow_mapping/directional_light.glsl')
        self.basic_light['shadowMap'].value = 0
        self.basic_light['color'].value = 1.0, 1.0, 1.0, 1.0
        self.shadowmap_program = self.load_program('programs/shadow_mapping/shadowmap.glsl')
        self.texture_prog = self.load_program('programs/texture.glsl')
        self.texture_prog['texture0'].value = 0
        self.sun_prog = self.load_program('programs/cube_simple.glsl')
        self.sun_prog['color'].value = 1, 1, 0, 1
        self.lightpos = 0, 0, 0
Esempio n. 15
0
    def __init__(self, path, flip=False, flip_left_right=False, intensity=1.0):
        
        super(Skybox, self).__init__()
        
        ctx = get_context()

        self.path = path
        #self.smpl = ctx.sampler(compare_func='<=')
        self.cube = geometry.cube(size=(1, 1, 1))
        self.hide = False
                
        self._items = dict(
            intensity = intensity,
            texture = load_texture_cube(
                path, 
                flip=flip, 
                flip_left_right=flip_left_right
            ),
        )
Esempio n. 16
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        imgui.create_context()
        self.wnd.ctx.error
        self.imgui = ModernglWindowRenderer(self.wnd)

        self.cube = geometry.cube(size=(2, 2, 2))
        self.prog = self.load_program('programs/cube_simple.glsl')
        self.prog['color'].value = (1.0, 1.0, 1.0, 1.0)
        self.prog['m_camera'].write(Matrix44.identity(dtype='f4'))
        self.prog['m_proj'].write(
            Matrix44.perspective_projection(75, 1.0, 1, 100, dtype='f4'))

        self.fbo = self.ctx.framebuffer(
            color_attachments=self.ctx.texture((512, 512), 4),
            depth_attachment=self.ctx.depth_texture((512, 512)),
        )
        # Ensure imgui knows about this texture
        # This is the color layer in the framebuffer
        self.imgui.register_texture(self.fbo.color_attachments[0])
Esempio n. 17
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cube = geometry.cube(size=(2, 2, 2))
        shader_source = {
            'vertex_shader':
            '''
                #version 330

                in vec3 in_position;
                in vec3 in_normal;

                uniform vec3 pos_offset;

                uniform Projection {
                    uniform mat4 matrix;
                } proj;

                uniform View {
                    uniform mat4 matrix;
                } view;

                out vec3 normal;
                out vec3 pos;

                void main() {
                    vec4 p = view.matrix * vec4(in_position + pos_offset, 1.0);
                    gl_Position =  proj.matrix * p;
                    mat3 m_normal = transpose(inverse(mat3(view.matrix)));
                    normal = m_normal * in_normal;
                    pos = p.xyz;
                }
            ''',
            'fragment_shader':
            '''
                #version 330

                out vec4 color;

                in vec3 normal;
                in vec3 pos;

                void main() {
                    float l = dot(normalize(-pos), normalize(normal));
                    color = vec4(1.0) * (0.25 + abs(l) * 0.75);
                }
            ''',
        }
        self.prog1 = self.ctx.program(**shader_source)
        self.prog1['pos_offset'].value = (1.1, 0, 0)
        self.prog2 = self.ctx.program(**shader_source)
        self.prog2['pos_offset'].value = (-1.1, 0, 0)

        self.vao1 = self.cube.instance(self.prog1)
        self.vao2 = self.cube.instance(self.prog2)

        self.m_proj = matrix44.create_perspective_projection_matrix(
            75,
            self.wnd.aspect_ratio,  # fov, aspect
            0.1,
            100.0,  # near, far
            dtype='f4',
        )

        proj_uniform1 = self.prog1['Projection']
        view_uniform1 = self.prog1['View']
        proj_uniform2 = self.prog2['Projection']
        view_uniform2 = self.prog2['View']

        self.proj_buffer = self.ctx.buffer(reserve=proj_uniform1.size)
        self.view_buffer = self.ctx.buffer(reserve=view_uniform1.size)

        proj_uniform1.binding = 1
        view_uniform1.binding = 2
        proj_uniform2.binding = 1
        view_uniform2.binding = 2

        self.proj_buffer.write(self.m_proj.tobytes())

        self.scope1 = self.ctx.scope(
            self.ctx.fbo,
            enable_only=moderngl.CULL_FACE | moderngl.DEPTH_TEST,
            uniform_buffers=[
                (self.proj_buffer, 1),
                (self.view_buffer, 2),
            ],
        )

        self.scope2 = self.ctx.scope(
            self.ctx.fbo,
            enable_only=moderngl.CULL_FACE | moderngl.DEPTH_TEST,
            uniform_buffers=[
                (self.proj_buffer, 1),
                (self.view_buffer, 2),
            ],
        )
Esempio n. 18
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.camera.projection.update(near=1, far=200)
        self.wnd.mouse_exclusivity = True

        # Offscreen buffer
        offscreen_size = 1024, 1024
        self.offscreen_depth = self.ctx.depth_texture(offscreen_size)
        self.offscreen_depth.compare_func = ''
        self.offscreen_depth.repeat_x = False
        self.offscreen_depth.repeat_y = False
        self.offscreen_color = self.ctx.texture(offscreen_size, 4)

        self.offscreen = self.ctx.framebuffer(
            color_attachments=[self.offscreen_color],
            depth_attachment=self.offscreen_depth,
        )

        # Scene geometry
        self.hmd = geometry.cube(size=np.array((7, 5, 1))/2, center=(0, 0, 0))
        self.hmd2 = geometry.cube(size=np.array((2, 2, 1))/2, center=(0, 0, 2))

        self.handL = geometry.cube(size=np.array((2, 2, 5))/2, center=(0, 0, 0))
        self.handL2 = geometry.cube(size=np.array((1, 1, 1))/2, center=(2, 0, 0))
        self.handL3 = geometry.cube(size=np.array((1, 1, 1))/2, center=(0, 0, 4))

        self.handR = geometry.cube(size=np.array((2, 2, 5))/2, center=(0, 0, 0))
        self.handR2 = geometry.cube(size=np.array((1, 1, 1))/2, center=(2, 0, 0))
        self.handR3 = geometry.cube(size=np.array((1, 1, 1))/2, center=(0, 0, 4))

        self.floor = geometry.cube(size=np.array((100, 0.3, 100)), center=(0, -16, 0))

        # self.sun = geometry.sphere(radius=1.0)

        # Debug geometry
        self.offscreen_quad = geometry.quad_2d(size=(0.5, 0.5), pos=(0.75, 0.75))
        self.offscreen_quad2 = geometry.quad_2d(size=(0.5, 0.5), pos=(0.25, 0.75))

        # Programs
        self.raw_depth_prog = self.load_program('programs/shadow_mapping/raw_depth.glsl')

        # self.basic_light = self.load_program('programs/shadow_mapping/directional_light.glsl')
        # self.basic_light['shadowMap'].value = 0
        # self.basic_light['color'].value = 1.0, 1.0, 1.0, 1.0


        self.shadowmap_program = self.load_program('programs/shadow_mapping/shadowmap.glsl')
        self.basic_lightL = self.load_program('programs/shadow_mapping/directional_light.glsl')
        self.basic_lightL['shadowMap'].value = 0
        self.basic_lightL['color'].value = 0.0, 1.0, 0.0, 1.0

        self.basic_lightR = self.load_program('programs/shadow_mapping/directional_light.glsl')
        self.basic_lightR['shadowMap'].value = 0
        self.basic_lightR['color'].value = 0.0, 0.0, 1.0, 1.0

        self.basic_lightHmd = self.load_program('programs/shadow_mapping/directional_light.glsl')
        self.basic_lightHmd['shadowMap'].value = 0
        self.basic_lightHmd['color'].value = 1.0, 0.0, 0.0, 1

        self.basic_lightFloor = self.load_program('programs/shadow_mapping/directional_light.glsl')
        self.basic_lightFloor['shadowMap'].value = 0
        self.basic_lightFloor['color'].value = 1.0, 1.0, 1.0, 1


        self.texture_prog = self.load_program('programs/texture.glsl')
        self.texture_prog['texture0'].value = 0

        self.sun_prog = self.load_program('programs/cube_simple.glsl')
        self.sun_prog['color'].value = 1, 1, 0, 1
        self.lightpos = 0, 0, 0
        time = 2
        self.lightpos = Vector3((math.sin(time) * 20, 5, math.cos(time) * 20), dtype='f4')
Esempio n. 19
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.wnd.mouse_exclusivity = True
     self.cube = geometry.cube(size=(2, 2, 2))
     self.prog = self.load_program('programs/cube_simple.glsl')
     self.prog['color'].value = 1.0, 1.0, 1.0, 1.0
Esempio n. 20
0
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.camera.projection.update(near=1, far=200)
        self.wnd.mouse_exclusivity = True

        # Offscreen buffer
        offscreen_size = 1024, 1024
        self.offscreen_depth = self.ctx.depth_texture(offscreen_size)
        self.offscreen_depth.compare_func = ""
        self.offscreen_depth.repeat_x = False
        self.offscreen_depth.repeat_y = False
        self.offscreen_color = self.ctx.texture(offscreen_size, 4)

        self.offscreen = self.ctx.framebuffer(
            color_attachments=[self.offscreen_color],
            depth_attachment=self.offscreen_depth,
        )

        # Scene geometry
        self.floor = geometry.cube(size=np.array((100, 0.3, 100)),
                                   center=(0, -16, 0))

        # self.sun = geometry.sphere(radius=1.0)

        # Debug geometry
        self.offscreen_quad = geometry.quad_2d(size=(0.5, 0.5),
                                               pos=(0.75, 0.75))
        self.offscreen_quad2 = geometry.quad_2d(size=(0.5, 0.5),
                                                pos=(0.25, 0.75))

        # Programs
        self.raw_depth_prog = self.load_program(
            "programs/shadow_mapping/raw_depth.glsl")

        # self.basic_light = self.load_program('programs/shadow_mapping/directional_light.glsl')
        # self.basic_light['shadowMap'].value = 0
        # self.basic_light['color'].value = 1.0, 1.0, 1.0, 1.0

        self.shadowmap_program = self.load_program(
            "programs/shadow_mapping/shadowmap.glsl")

        self.basic_lightFloor = self.load_program(
            "programs/shadow_mapping/directional_light.glsl")
        self.basic_lightFloor["shadowMap"].value = 0
        self.basic_lightFloor["color"].value = 1.0, 1.0, 1.0, 1

        self.texture_prog = self.load_program("programs/texture.glsl")
        self.texture_prog["texture0"].value = 0

        self.sun_prog = self.load_program("programs/cube_simple.glsl")
        self.sun_prog["color"].value = 1, 1, 0, 1
        self.lightpos = 0, 0, 0
        time = 2
        self.lightpos = Vector3((math.sin(time) * 20, 5, math.cos(time) * 20),
                                dtype="f4")

        self.device_list = []
        np.random.seed(69)
        for i in myDriver.device_order:
            if i == "h":
                self.device_list.append(
                    (Device_hmd(
                        self.ctx,
                        tuple(np.random.randint(100, size=(4, )) / 100)),
                     Velocity_vector(self.ctx, (1, 0, 0, 1))))

            elif i == "c":
                self.device_list.append(
                    (Device_cntrlr(
                        self.ctx,
                        tuple(np.random.randint(100, size=(4, )) / 100)),
                     Velocity_vector(self.ctx, (1, 0, 0, 1),
                                     (-0.75, 0, -1.75))))

            elif i == "t":
                self.device_list.append(
                    (Device_trkr(
                        self.ctx,
                        tuple(np.random.randint(100, size=(4, )) / 100)),
                     Velocity_vector(self.ctx, (1, 0, 0, 1))))
Esempio n. 21
0
 def __init__(self, pos=(0, 0, 0), size=(1, 1, 1)):
     super().__init__()
     self._cube = geometry.cube(size=size, center=pos)
Esempio n. 22
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.cube = geometry.cube(size=(2, 2, 2))
     self.prog = self.load_program('programs/cube_simple.glsl')
     self.prog['m_proj'].write(self.camera.projection.tobytes())
     self.prog['color'].value = (1.0, 1.0, 1.0, 1.0)