Esempio n. 1
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fireworks Demo",
            sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED,
            width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Textures
        texture = loadTexture(b'res/flare.bmp', gl.GL_ALPHA, gl.GL_REPEAT)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(0.001, 0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)

        # the base system
        self.basesystem = BaseSystem(self.height, texture)

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleY = 0.0
        self.camPosZ = 5.0
        self.spacePressed = -1.0
        self.systems = []
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks()-1]
        self.lasttime = self.frames[-1]
Esempio n. 2
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Rain Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_MULTISAMPLEBUFFERS, 1)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_MULTISAMPLESAMPLES, 4)
        gl.glClearColor(0.8, 0.8, 0.8, 0.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # gl.glDisable(gl.GL_DEPTH)
        gl.glDisable(gl.GL_DEPTH_TEST)
        # load Textures
        self.txPaving = loadTexture(b'res/paving.bmp',
                                    gl.GL_RGB,
                                    gl.GL_REPEAT,
                                    mipmap=True)
        txSplash = loadTexture(b'res/waterdrops.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # init fog
        gl.glEnable(gl.GL_FOG)
        gl.glFogi(gl.GL_FOG_MODE, gl.GL_EXP2)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        self.sizeRatio = self.width / 1440
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        dropRenderer = GLPointRenderer.create()
        dropRenderer.setType(spk.POINT_CIRCLE)
        dropRenderer.setSize(2.0 * self.sizeRatio)
        dropRenderer.enableBlending(True)
        self.dropRenderer = dropRenderer
        rainRenderer = GLLineRenderer.create()
        rainRenderer.setLength(-0.1)
        rainRenderer.enableBlending(True)
        self.rainRenderer = rainRenderer
        splashRenderer = GLQuadRenderer.create()
        splashRenderer.setScale(0.05, 0.05)
        splashRenderer.setTexturingMode(spk.TEXTURE_2D)
        splashRenderer.setTexture(txSplash)
        splashRenderer.enableBlending(True)
        splashRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        self.splashRenderer = splashRenderer
        # create Model
        rain_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_MASS
        rain_mutable = spk.FLAG_NONE
        rain_random = spk.FLAG_MASS
        rainModel = spk.Model.create(rain_enable, rain_mutable, rain_random)
        rainModel.setParam(spk.PARAM_ALPHA, 0.2)
        rainModel.setImmortal(True)
        self.rainModel = rainModel
        dropModel = spk.Model.create(rain_enable, rain_mutable,
                                     rain_random)  # same as rain
        dropModel.setParam(spk.PARAM_ALPHA, 0.6)
        self.dropModel = dropModel
        splash_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        splash_mutable = spk.FLAG_SIZE | spk.FLAG_ALPHA
        splash_random = spk.FLAG_SIZE | spk.FLAG_ANGLE
        splashModel = spk.Model.create(splash_enable, splash_mutable,
                                       splash_random)
        splashModel.setParam(spk.PARAM_ANGLE, 0.0, 2.0 * math.pi)
        splashModel.setParam(spk.PARAM_ALPHA, 1.0, 0.0)
        self.splashModel = splashModel
        # create Emitter
        rainZone = spk.Ring.create(spk.Vector3D(0.0, 5.0, 0.0))
        self.rainZone = rainZone
        rainEmitter = spk.SphericEmitter.create(spk.Vector3D(0.0, -1.0, 0.0),
                                                0.0, 0.03 * math.pi)
        rainEmitter.setZone(rainZone)
        self.rainEmitter = rainEmitter
        self.dropEmitter = spk.SphericEmitter.create(
            spk.Vector3D(0.0, 1.0, 0.0), 0.0, 0.2 * math.pi)
        # create Group
        gravity = spk.Vector3D(0.0, -2.0, 0.0)
        rainGroup = spk.Group.create(rainModel, 8000)
        rainGroup.setCustomUpdate(lambda p, t: self.killRain(p, t))
        rainGroup.setRenderer(rainRenderer)
        rainGroup.addEmitter(rainEmitter)
        rainGroup.setFriction(0.7)
        rainGroup.setGravity(gravity)
        self.rainGroup = rainGroup
        dropGroup = spk.Group.create(dropModel, 16000)
        dropGroup.setRenderer(dropRenderer)
        dropGroup.setFriction(0.7)
        dropGroup.setGravity(gravity)
        self.dropGroup = dropGroup
        splashGroup = spk.Group.create(splashModel, 2400)
        splashGroup.setRenderer(splashRenderer)
        self.splashGroup = splashGroup
        # create System
        system = spk.System.create()
        system.addGroup(splashGroup)
        system.addGroup(dropGroup)
        system.addGroup(rainGroup)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 0.0
        self.angleX = 12.0
        self.posX = 0.0
        self.posZ = 0.0
        self.rainRatio = 0.5
        self.recompute = True
        self.nbParticles = ''
        self.fps = ''
        self.strRainRate = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 3
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Flakes Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setBlending(
            spk.BLENDING_ADD
        )  # blending method between particles(additive blending)
        renderer.enableRenderingHint(spk.DEPTH_TEST,
                                     False)  # notifying not to use depth info
        renderer.setAlphaTestThreshold(0.8)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA  # use color channels(RGBA)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setParam(spk.PARAM_RED, 1.0)
        model.setParam(spk.PARAM_GREEN, 0.8)
        model.setParam(spk.PARAM_BLUE, 0.3)
        model.setParam(spk.PARAM_ALPHA, 0.4)
        model.setImmortal(True)  # particle is immortal
        self.model = model
        # no Emitter
        # create Modifier
        self.sphere = spk.Sphere.create(spk.Vector3D(), 1.0)
        obstacle = spk.Obstacle.create(self.sphere)  # type: spk.Obstacle
        obstacle.setFriction(0.9)
        obstacle.setBouncingRatio(0.9)
        self.obstacle = obstacle
        # create Group
        self.NB_PARTICLES = [10000, 25000, 50000, 100000, 200000, 500000]
        group = spk.Group.create(model,
                                 self.NB_PARTICLES[-1])  # type: spk.Group
        group.addModifier(obstacle)
        group.setRenderer(renderer)
        group.setGravity(spk.Vector3D(0.0, -0.5, 0.0))
        group.setFriction(0.2)
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleX = 0.0
        self.angleZ = 0.0
        self.camPosZ = 2.75
        self.particleIndex = 2
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 4
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fire Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load textures
        txFire = loadTexture(b'res/fire2.bmp',
                             gl.GL_ALPHA,
                             gl.GL_CLAMP,
                             mipmap=True)
        txSmoke = loadTexture(b'res/explosion.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # lighting
        light_ambient = [0.15, 0.15, 0.25, 1.0]
        light_diffuse = [1.0, 0.75, 0.25, 1.0]
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, light_ambient)
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, light_diffuse)
        gl.glLightf(gl.GL_LIGHT0, gl.GL_QUADRATIC_ATTENUATION, 20.0)
        mat_ambient = [0.2, 0.2, 0.2, 1.0]
        mat_diffuse = [1.0, 1.0, 1.0, 1.0]
        gl.glMaterialfv(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT, mat_ambient)
        gl.glMaterialfv(gl.GL_FRONT_AND_BACK, gl.GL_DIFFUSE, mat_diffuse)
        gl.glLightModelfv(gl.GL_LIGHT_MODEL_AMBIENT, light_ambient)
        gl.glLightModelf(gl.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init PyWavefront
        self.scene = pywavefront.Wavefront('./res/SceneFireCamp.obj')

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)

        # create Renderer
        fireRenderer = GLQuadRenderer.create()  # type: GLQuadRenderer
        fireRenderer.setScale(0.3, 0.3)
        fireRenderer.setTexturingMode(spk.TEXTURE_2D)
        fireRenderer.setTexture(txFire)
        fireRenderer.setTextureBlending(gl.GL_MODULATE)
        fireRenderer.setBlending(spk.BLENDING_ADD)
        fireRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        fireRenderer.setAtlasDimensions(2, 2)
        self.fireRenderer = fireRenderer
        smokeRenderer = GLQuadRenderer.create()  # type: GLQuadRenderer
        smokeRenderer.setScale(0.3, 0.3)
        smokeRenderer.setTexturingMode(spk.TEXTURE_2D)
        smokeRenderer.setTexture(txSmoke)
        smokeRenderer.setTextureBlending(gl.GL_MODULATE)
        smokeRenderer.setBlending(spk.BLENDING_ALPHA)
        smokeRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        smokeRenderer.setAtlasDimensions(2, 2)
        self.smokeRenderer = smokeRenderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)

        # create Model
        fire_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | \
            spk.FLAG_SIZE | spk.FLAG_ANGLE | spk.FLAG_TEXTURE_INDEX
        fire_mutable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_ALPHA | spk.FLAG_ANGLE
        fire_random = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_TEXTURE_INDEX | spk.FLAG_ANGLE
        fire_interpolated = spk.FLAG_SIZE
        fireModel = spk.Model.create(fire_enable, fire_mutable, fire_random,
                                     fire_interpolated)  # type: spk.Model
        fireModel.setParam(spk.PARAM_RED, 0.8, 0.9, 0.8,
                           0.9)  # [min,max]on birth, [min,max]on death
        fireModel.setParam(spk.PARAM_GREEN, 0.5, 0.6, 0.5, 0.6)
        fireModel.setParam(spk.PARAM_BLUE, 0.3)
        fireModel.setParam(spk.PARAM_ALPHA, 0.4, 0.0)  # on birth, on death
        minAngle, maxAngle = 0.0, 2.0 * math.pi
        fireModel.setParam(spk.PARAM_ANGLE, minAngle, maxAngle, minAngle,
                           maxAngle)
        fireModel.setParam(spk.PARAM_TEXTURE_INDEX, 0.0, 4.0)
        fireModel.setLifeTime(1.0, 1.5)
        ip_size = fireModel.getInterpolator(spk.PARAM_SIZE)
        ip_size.addEntry(0.5, 2.0, 5.0)
        ip_size.addEntry(1.0, 0.0)
        self.fireModel = fireModel
        smoke_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | \
            spk.FLAG_SIZE | spk.FLAG_ANGLE | spk.FLAG_TEXTURE_INDEX
        smoke_mutable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_SIZE | spk.FLAG_ANGLE
        smoke_random = spk.FLAG_TEXTURE_INDEX | spk.FLAG_ANGLE
        smoke_interpolated = spk.FLAG_ALPHA
        smokeModel = spk.Model.create(smoke_enable, smoke_mutable,
                                      smoke_random,
                                      smoke_interpolated)  # type: spk.Model
        smokeModel.setParam(spk.PARAM_RED, 0.3, 0.2)
        smokeModel.setParam(spk.PARAM_GREEN, 0.25, 0.2)
        smokeModel.setParam(spk.PARAM_BLUE, 0.2)
        smokeModel.setParam(spk.PARAM_ALPHA, 0.2, 0.0)
        smokeModel.setParam(spk.PARAM_SIZE, 5.0, 10.0)
        smokeModel.setParam(spk.PARAM_TEXTURE_INDEX, 0.0, 4.0)
        smokeModel.setParam(spk.PARAM_ANGLE, 0.0, 2.0 * math.pi, 0.0,
                            2.0 * math.pi)
        smokeModel.setLifeTime(5.0, 5.0)
        ip_alpha = smokeModel.getInterpolator(spk.PARAM_ALPHA)
        ip_alpha.addEntry(0.0, 0.0)
        ip_alpha.addEntry(0.2, 0.2)
        ip_alpha.addEntry(1.0, 0.0)
        self.smokeModel = smokeModel

        # create Emitter
        fireEmitter1 = spk.StraightEmitter.create(spk.Vector3D(0.0, 1.0, 0.0))
        fireEmitter1.setZone(
            spk.Sphere.create(spk.Vector3D(0.0, -1.0, 0.0), 0.5))
        fireEmitter1.setFlow(40)
        fireEmitter1.setForce(1.0, 2.5)
        fireEmitter2 = spk.StraightEmitter.create(spk.Vector3D(1.0, 0.6, 0.0))
        fireEmitter2.setZone(
            spk.Sphere.create(spk.Vector3D(0.15, -1.2, 0.075), 0.1))
        fireEmitter2.setFlow(15)
        fireEmitter2.setForce(0.5, 1.5)
        fireEmitter3 = spk.StraightEmitter.create(spk.Vector3D(
            -0.6, 0.8, -0.8))
        fireEmitter3.setZone(
            spk.Sphere.create(spk.Vector3D(-0.375, -1.15, -0.375), 0.3))
        fireEmitter3.setFlow(15)
        fireEmitter3.setForce(0.5, 1.5)
        fireEmitter4 = spk.StraightEmitter.create(spk.Vector3D(-0.8, 0.5, 0.2))
        fireEmitter4.setZone(
            spk.Sphere.create(spk.Vector3D(-0.255, -1.2, 0.225), 0.2))
        fireEmitter4.setFlow(10)
        fireEmitter4.setForce(0.5, 1.5)
        fireEmitter5 = spk.StraightEmitter.create(spk.Vector3D(0.1, 0.8, -1.0))
        fireEmitter5.setZone(
            spk.Sphere.create(spk.Vector3D(-0.075, -1.2, -0.3), 0.2))
        fireEmitter5.setFlow(10)
        fireEmitter5.setForce(0.5, 1.5)
        smokeEmitter = spk.SphericEmitter.create(spk.Vector3D(0.0, 1.0, 0.0),
                                                 0.0, 0.5 * math.pi)
        smokeEmitter.setZone(spk.Sphere.create(spk.Vector3D(), 1.2))
        smokeEmitter.setFlow(25)
        smokeEmitter.setForce(0.5, 1.0)

        # no Modifier

        # create Group
        fireGroup = spk.Group.create(fireModel, 135)  # type: spk.Group
        fireGroup.addEmitter(fireEmitter1)
        fireGroup.addEmitter(fireEmitter2)
        fireGroup.addEmitter(fireEmitter3)
        fireGroup.addEmitter(fireEmitter4)
        fireGroup.addEmitter(fireEmitter5)
        fireGroup.setRenderer(fireRenderer)
        fireGroup.setGravity(spk.Vector3D(0.0, 3.0, 0.0))
        self.fireGroup = fireGroup
        smokeGroup = spk.Group.create(smokeModel, 135)  # type: spk.Group
        smokeGroup.addEmitter(smokeEmitter)
        smokeGroup.setRenderer(smokeRenderer)
        smokeGroup.setGravity(spk.Vector3D(0.0, 0.4, 0.0))
        self.smokeGroup = smokeGroup

        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(fireGroup)
        system.addGroup(smokeGroup)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 30.0
        self.angleX = 25.0
        self.camPosZ = 12.0
        self.smoke = True
        self.lightTime = 0
        self.nbParticles = ''
        self.fps = ''
        self.strSmoke = 'SMOKE: ON'
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 5
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fountain Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.68, 0.85, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
        # init fog
        gl.glEnable(gl.GL_FOG)
        gl.glFogi(gl.GL_FOG_MODE, gl.GL_EXP2)
        gl.glFogfv(gl.GL_FOG_COLOR, [0.0, 0.68, 0.85, 1.0])
        gl.glFogf(gl.GL_FOG_DENSITY, 0.04)
        gl.glHint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST)
        # load Textures
        self.txGrass = loadTexture(b'res/grass.bmp',
                                   gl.GL_RGB,
                                   gl.GL_REPEAT,
                                   mipmap=True)
        self.txFountain = loadTexture(b'res/tile.bmp',
                                      gl.GL_RGB,
                                      gl.GL_REPEAT,
                                      mipmap=True)
        self.txWater = loadTexture(b'res/water.bmp',
                                   gl.GL_RGB,
                                   gl.GL_REPEAT,
                                   mipmap=True)
        txSplash = loadTexture(b'res/waterdrops.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # create display lists
        self.createDisplayLists()

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLQuadRenderer.create(1.0)  # type: GLQuadRenderer
        renderer.setScale(0.06, 0.06)
        renderer.setTexturingMode(spk.TEXTURE_2D)
        renderer.setTexture(txSplash)
        renderer.setBlending(spk.BLENDING_ALPHA)
        renderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        model_mutable = spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        model_random = spk.FLAG_SIZE | spk.FLAG_ANGLE
        model = spk.Model.create(model_enable, model_mutable,
                                 model_random)  # type: spk.Model
        model.setParam(spk.PARAM_ALPHA, 0.2, 0.0)
        model.setParam(spk.PARAM_SIZE, 1.0, 1.0, 2.0, 8.0)
        model.setParam(spk.PARAM_ANGLE, 0.0, 4.0 * math.pi, 0.0, 4.0 * math.pi)
        model.setLifeTime(1.6, 2.2)
        self.model = model
        # create Emitter
        self.emitterZones = []
        self.emitters = []
        # splash to just above(x1)
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 1.0, 0.0)))
        # splash from center of fountain(x4)
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 3.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 3.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 3.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 3.0, -1.0)))
        # splash from the side of fountain(x8)
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(-1.6, 0.1, -1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(1.6, 0.1, 1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(1.6, 0.1,
                                                               -1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(-1.6, 0.1,
                                                               1.6)))
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(-2.26, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(2.26, 0.1,
                                                               0.0)))
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(0.0, 0.1, -2.26)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1,
                                                               2.26)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 2.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 2.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 2.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 2.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.41, 2.0, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.41, 2.0, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 2.0, 1.41)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 2.0, -1.41)))
        self.flow = [
            500.0, 600.0, 600.0, 600.0, 600.0, 900.0, 900.0, 900.0, 900.0,
            900.0, 900.0, 900.0, 900.0
        ]
        self.flowLow = [
            150.0, 200.0, 200.0, 200.0, 200.0, 250.0, 250.0, 250.0, 250.0,
            250.0, 250.0, 250.0, 250.0
        ]
        for i in range(len(self.emitters)):
            self.emitters[i].setZone(self.emitterZones[i])
            self.emitters[i].setFlow(self.flow[i])
            self.emitters[i].setForce(2.5, 4.0)
        self.emitters[0].setForce(3.0, 3.5)
        # no Modifier
        # create Group
        group = spk.Group.create(model, 20000)  # type: spk.Group
        for emitter in self.emitters:
            group.addEmitter(emitter)
        group.setRenderer(renderer)
        group.setCustomUpdate(self.splash)
        group.setGravity(spk.Vector3D(0.0, -2.2, 0.0))
        group.setFriction(0.7)
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.totalTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.highGraphics = True
        self.angleY = 25.0
        self.angleX = 25.0
        self.camPosZ = 8.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 6
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Collision Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Texture
        txParticle = loadTexture(b'res/ball2.bmp', gl.GL_RGBA, gl.GL_CLAMP)
        self.txCrate = loadTexture(b'res/crate.bmp', gl.GL_RGB, gl.GL_REPEAT)
        self.txFloor = loadTexture(b'res/floor.bmp', gl.GL_RGB, gl.GL_REPEAT)
        self.txWall = loadTexture(b'res/wall.bmp', gl.GL_RGB, gl.GL_REPEAT)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # create Renderer
        spk.setRandomSeed(int(time.time()))
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setType(
            spk.POINT_SPRITE)  # using Point Sprite(require >=OpenGL2.0)
        renderer.setTexture(txParticle)  # use the texture on drawing
        renderer.enableWorldSize(
            True
        )  # true: unit is adjusted with the screen, false: unit is pixel(fixed)
        GLPointRenderer.setPixelPerUnit(45.0 * math.pi / 180.0, self.height)
        renderer.setSize(0.05)
        renderer.setBlending(
            spk.BLENDING_NONE
        )  # blending method between particles(no blending)
        renderer.enableRenderingHint(spk.ALPHA_TEST,
                                     True)  # notifying not to use depth info
        renderer.setAlphaTestThreshold(0.8)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE  # use color channels(RGB)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setLifeTime(10.0, 10.0)  # particle's life time is 10[sec]
        self.model = model
        # create Emitter
        emit_dir = spk.Vector3D(0.0, 0.0, -1.0)
        emit_center = spk.Vector3D(0.0, 2.0, 4.475)
        minangle = 0.0 * math.pi  # zenith angle(min)
        maxangle = 0.5 * math.pi  # zenith angle(max)
        emitter = spk.SphericEmitter.create(
            emit_dir, minangle, maxangle)  # type: spk.SphericEmitter
        emitter.setZone(
            spk.Point.create(emit_center),
            True)  # particles are randomly placed in the specified zone
        emitter.setFlow(300)  # max number of particles
        emitter.setForce(1.5, 2.5)  # emittion power
        # create Group
        maxparticle = 3100  # upper limit number of particles
        group = spk.Group.create(model, maxparticle)  # type: spk.Group
        group.addEmitter(emitter)
        group.setRenderer(renderer)
        group.setCustomBirth(self.assignColor)
        group.setGravity(spk.Vector3D(0.0, -0.8, 0.0))
        group.setFriction(0.2)
        self.group = group
        # create Room objects
        self.ROOM_X = 7.0
        self.ROOM_Y = 3.0
        self.ROOM_Z = 9.0
        self.boxes = []
        self.partitions = []
        self.initRoom(group)  # obstacles
        self.createDisplayLists()  # display list for OpenGL drawing
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.enableBoxDrawing = False
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 90.0
        self.angleX = 45.0
        self.camPosZ = 10.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 7
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Writing Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load texture
        texture = loadTexture(b'res/point.bmp', gl.GL_ALPHA, gl.GL_CLAMP)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLQuadRenderer.create(1.0)  # type: GLQuadRenderer
        renderer.enableBlending(True)
        renderer.setBlendingFunctions(gl.GL_SRC_ALPHA, gl.GL_ONE)
        renderer.setTexturingMode(spk.TEXTURE_2D)
        renderer.setTexture(texture)
        renderer.setTextureBlending(gl.GL_MODULATE)
        renderer.setScale(0.05, 0.05)
        renderer.enableRenderingHint(spk.DEPTH_TEST, False)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE
        model_mutable = spk.FLAG_ALPHA | spk.FLAG_SIZE
        model = spk.Model.create(model_enable,
                                 model_mutable)  # type: spk.Model
        model.setParam(spk.PARAM_ALPHA, 5.0,
                       0.0)  # the particles will fade as the die
        model.setParam(spk.PARAM_SIZE, 1.0,
                       15.0)  # the particles will enlarge over time
        model.setLifeTime(5.0, 6.0)
        self.model = model
        # create Emitter
        # We set up a spheric emitter that emits in all direction with a very small force
        # in order to slightly displace the particles
        emitter = spk.RandomEmitter.create()
        emitter.setForce(0.01, 0.01)
        self.emitter = emitter  # uses it at later directly
        # create Group
        group = spk.Group.create(model, 14000)  # type: spk.Group
        group.setRenderer(renderer)
        group.setFriction(
            -0.3)  # negative friction: The particles will accelerate over time
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleY = 0.0
        self.angleX = 0.0
        self.camPosZ = 5.0
        self.add = False
        self.oldX = 0
        self.oldY = 0
        self.oldZ = 0
        self.offset = 0.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]

        # This computes the ratio to go from screen coordinates to universe coordinates
        self.screenToUniverse = 2.0 * self.camPosZ * math.tan(
            45.0 * 0.5 * math.pi / 180.0) / self.height