Exemplo n.º 1
0
    def __init__(self, size, pos_data, rip_texture=None, stretched=1.0):
        #TODO: Make kernel size work!
        #Angle limiting forces

        #Size
        if type(size) in [type([]), type(())]:
            self.size = list(size)
        else:
            self.size = [size, size]

        #Misc.
        self.view_2d = glLibView2D((0, 0, self.size[0], self.size[1]))

        #Physics
        self.forces = [0.0, 0.0, 0.0]

        #Cloth Parameters
        self.dampening = 0.98
        self.tensor = 1.0
        self.angle_tensor = 0.0  #1.0
        self.max_jitter_length = 1.0
        self.gravity = [0.0, 0.0, 0.0]
        self.kernel_size = 1
        self.steps = 1
        self.normal_flip = False
        self.loop = [False, False]
        self.time_step = 1.0

        #Collision Objects
        self.num_obstacles = 0
        self.collidable = {}
        self.is_garment = False

        #Geometry
        self.particles = glLibGrid2D(self.size)
        self.particles_mesh = glLibGrid2DMesh(self.size)

        #Textures
        self.pos_restrained_tex = glLibTexture2D(
            pos_data, (0, 0, self.size[0], self.size[1]),
            GL_RGBA,
            precision=32)
        ##        self.
        self.original_pos_restrained_tex = self.pos_restrained_tex
        self.velocity_tex = glLibTexture2D(None,
                                           (0, 0, self.size[0], self.size[1]),
                                           GL_RGB,
                                           precision=32)
        self.vec_tex = None
        self.normal_tex = None
        self.dist_edges_tex = None
        self.dist_corners_tex = None
        self.diffuse_texture = None
        self.obstacles_tex = None
        self.obstacles_aux_param_tex = None
        self.texture_repeat = [1.0, 1.0]

        #FBOs
        self.update_framebuffer = glLibFBO(self.size)
        self.update_framebuffer.add_render_target(1,
                                                  precision=32,
                                                  type=GLLIB_RGBA)
        self.update_framebuffer.add_render_target(2, precision=32)
        self.update_framebuffer.add_render_target(3,
                                                  precision=8)  #for debugging
        self.collision_framebuffer = glLibFBO(self.size)
        self.collision_framebuffer.add_render_target(1,
                                                     precision=32,
                                                     type=GLLIB_RGBA)
        self.collision_framebuffer.add_render_target(2, precision=32)
        self.collision_framebuffer.add_render_target(3, precision=8)
        self.normal_framebuffer = glLibFBO(self.size)
        self.normal_framebuffer.add_render_target(1)
        self.dist_angle_framebuffer = glLibFBO(self.size)
        self.dist_angle_framebuffer.add_render_target(1,
                                                      precision=32,
                                                      type=GLLIB_RGBA)
        self.dist_angle_framebuffer.add_render_target(2,
                                                      precision=32,
                                                      type=GLLIB_RGBA)
        self.set_loop(*self.loop)

        #Shaders
        ##        print "Compiling Update Shader"
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_CLOTH_UPDATE)
        ##        print "Compiling Collision Shader"
        self.collision_shader = glLibShader()
        self.collision_shader.use_prebuilt(GLLIB_CLOTH_COLLIDE)
        ##        print "Compiling Normal Shader"
        self.normal_shader = glLibShader()
        self.normal_shader.use_prebuilt(GLLIB_CLOTH_NORMAL)
        ##        print "Compiling Draw Shader"
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_CLOTH_DRAW)
        ##        print "Compiling Distance Shader"
        self.dist_shader = glLibShader()
        self.dist_shader.use_prebuilt(GLLIB_CLOTH_DISTANCE)
        ##        self.update_shader.save_vertex()

        #Get Target Distances
        self.glLibInternal_push()
        self.dist_angle_framebuffer.enable([1, 2])
        self.glLibInternal_use_dist_shader()
        self.dist_shader.pass_float("stretched", stretched)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        self.view_2d.set_view()
        self.particles.draw()
        glLibUseShader(None)
        self.dist_angle_framebuffer.disable()
        self.glLibInternal_pop()
        self.dist_edges_tex = self.dist_angle_framebuffer.get_texture(1)
        self.dist_corners_tex = self.dist_angle_framebuffer.get_texture(2)

        #Initialize Position
        self.glLibInternal_initialize_position()
Exemplo n.º 2
0
    def __init__(self, size, pos_data, rip_texture=None, stretched=1.0):
        # TODO: Make kernel size work!
        # Angle limiting forces

        # Size
        if type(size) in [type([]), type(())]:
            self.size = list(size)
        else:
            self.size = [size, size]

        # Misc.
        self.view_2d = glLibView2D((0, 0, self.size[0], self.size[1]))

        # Physics
        self.forces = [0.0, 0.0, 0.0]

        # Cloth Parameters
        self.scale = 1.0
        self.trans = [0.0, 0.0, 0.0]
        self.dampening = 0.98
        self.tensor = 1.0
        self.angle_tensor = 0.0  # 1.0
        self.max_jitter_length = 1.0
        self.gravity = [0.0, 0.0, 0.0]
        self.kernel_size = 1
        self.steps = 1
        self.normal_flip = False
        self.loop = [False, False]
        self.time_step = 1.0

        # Collision Objects
        self.num_obstacles = 0
        self.collidable = {}
        self.is_garment = False

        # Geometry
        self.particles = glLibGrid2D(self.size)
        self.particles_mesh = glLibGrid2DMesh(self.size)

        # Textures
        self.pos_restrained_tex = glLibTexture2D(pos_data, (0, 0, self.size[0], self.size[1]), GL_RGBA, precision=32)
        ##        self.
        self.original_pos_restrained_tex = self.pos_restrained_tex
        self.velocity_tex = glLibTexture2D(None, (0, 0, self.size[0], self.size[1]), GL_RGB, precision=32)
        self.vec_tex = None
        self.normal_tex = None
        self.dist_edges_tex = None
        self.dist_corners_tex = None
        self.diffuse_texture = None
        self.obstacles_tex = None
        self.obstacles_aux_param_tex = None
        self.texture_repeat = [1.0, 1.0]

        # FBOs
        self.update_framebuffer = glLibFBO(self.size)
        self.update_framebuffer.add_render_target(1, precision=32, type=GLLIB_RGBA)
        self.update_framebuffer.add_render_target(2, precision=32)
        self.update_framebuffer.add_render_target(3, precision=8)
        self.collision_framebuffer = glLibFBO(self.size)
        self.collision_framebuffer.add_render_target(1, precision=32, type=GLLIB_RGBA)
        self.collision_framebuffer.add_render_target(2, precision=32)
        self.collision_framebuffer.add_render_target(3, precision=8)
        self.normal_framebuffer = glLibFBO(self.size)
        self.normal_framebuffer.add_render_target(1)
        self.dist_angle_framebuffer = glLibFBO(self.size)
        self.dist_angle_framebuffer.add_render_target(1, precision=32, type=GLLIB_RGBA)
        self.dist_angle_framebuffer.add_render_target(2, precision=32, type=GLLIB_RGBA)
        self.set_loop(*self.loop)

        # Shaders
        ##        print "Compiling Update Shader"
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_CLOTH_UPDATE)
        ##        print "Compiling Collision Shader"
        self.collision_shader = glLibShader()
        self.collision_shader.use_prebuilt(GLLIB_CLOTH_COLLIDE)
        ##        print "Compiling Normal Shader"
        self.normal_shader = glLibShader()
        self.normal_shader.use_prebuilt(GLLIB_CLOTH_NORMAL)
        ##        print "Compiling Draw Shader"
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_CLOTH_DRAW)
        ##        print "Compiling Distance Shader"
        self.dist_shader = glLibShader()
        self.dist_shader.use_prebuilt(GLLIB_CLOTH_DISTANCE)
        ##        self.update_shader.save_vertex()

        # Get Target Distances
        self.glLibInternal_push()
        self.dist_angle_framebuffer.enable([1, 2])
        self.glLibInternal_use_dist_shader()
        self.dist_shader.pass_float("stretched", stretched)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        self.view_2d.set_view()
        self.particles.draw()
        glLibUseShader(None)
        self.dist_angle_framebuffer.disable()
        self.glLibInternal_pop()
        self.dist_edges_tex = self.dist_angle_framebuffer.get_texture(1)
        self.dist_corners_tex = self.dist_angle_framebuffer.get_texture(2)

        # Initialize Position
        self.glLibInternal_initialize_position()
Exemplo n.º 3
0
    def __init__(self, n, precision=8):
        #self.n differs from n by a maximum of sqrt(n)+1
        self.size = [int(round(n**0.5))] * 2
        self.n = self.size[0] * self.size[1]

        #Shader to update particles
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_PARTICLE_UPDATE)
        ##        print self.update_shader.errors

        #Shader to draw particles
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_PARTICLE_DRAW)
        ##        print self.draw_shader.errors

        #Particles as VBO
        self.particles = glLibGrid2D(self.size[0])

        #Parameters
        self.origin = [0.0, 0.0, 0.0]
        self.initialspeed = [0.0, 0.0, 0.0]
        self.forces = [0.0, 0.0, 0.0]
        self.scale = [1, 1, 1]
        self.density = 1.0
        self.step = 1.0 / (self.n - 1)
        self.density_constant = (1.0 / 64.0) * (4.0**log(self.size[0],
                                                         2.0)) * self.step
        self.trans = [0.0, 0.0, 0.0]
        self.fade = 1.0
        self.jitter = [0.0, 0.0, 0.0]
        self.psize = 100.0
        #   Edge handling
        self.negx = 1.0
        self.negy = 1.0
        self.negz = 1.0
        self.posx = 1.0
        self.posy = 1.0
        self.posz = 1.0

        #Data Textures
        self.pos_time_texture = None
        self.velocity_texture = None

        self.view_2D = glLibView2D((0, 0, self.size[0], self.size[1]))

        self.point_texture = glLibTexture2D("glLib/fireparticle.png",
                                            (0, 0, 8, 8), GLLIB_RGBA)
        self.point_texture.edge(GLLIB_CLAMP)

        self.precision = precision

        self.framebuffer1 = glLibFBO(self.size)
        self.framebuffer1.add_render_target(1,
                                            type=GLLIB_RGBA,
                                            precision=self.precision)
        self.framebuffer1.add_render_target(2,
                                            type=GLLIB_RGBA,
                                            precision=self.precision)

        self.framebuffer2 = glLibFBO(self.size)
        self.framebuffer2.add_render_target(1,
                                            type=GLLIB_RGBA,
                                            precision=self.precision)
        self.framebuffer2.add_render_target(2,
                                            type=GLLIB_RGBA,
                                            precision=self.precision)

        self.pingpong = 1

        xvalues = np.zeros(self.n) + 0.5
        yvalues = np.zeros(self.n) + 0.5
        zvalues = np.zeros(self.n) + 0.5
        tvalues = np.arange(0.0, 1.0 + (1.0 / self.n),
                            1.0 / (self.n - 1.0)).astype(float)
        zeros = np.zeros(self.n)
        texarray = np.concatenate([xvalues, yvalues, zvalues,
                                   tvalues]).reshape(4, -1).T
        texarray = texarray.reshape((self.size[0], self.size[1], 4))
        self.pos_time_texture = glLibTexture2D(
            texarray, (0, 0, self.size[0], self.size[1]), GLLIB_RGBA)

        vecs = np.random.standard_normal(size=(self.size[0], self.size[1], 3))
        magnitudes = np.sqrt((vecs * vecs).sum(axis=-1))
        uvecs = vecs / magnitudes[..., np.newaxis]
        randlen = np.random.random((self.size[0], self.size[1]))
        randvecs = uvecs * randlen[..., np.newaxis]
        rgb = (((randvecs + 1.0) / 2.0) * 255.0).astype(int)
        surface = pygame.surfarray.make_surface(rgb)
        self.rand_tex = glLibTexture2D(surface,
                                       (0, 0, self.size[0], self.size[1]),
                                       GLLIB_RGB)

        self.get_new = False
        self.update()
        self.get_new = True
Exemplo n.º 4
0
    def __init__(self,pos_length_surf,grow_surf,length_scale,max_length,density):
        #Size
        self.size = list(pos_length_surf.get_size())

        #Misc.
        self.view_2d = glLibView2D((0,0,self.size[0],self.size[1]))
        self.update_pingpong = 1
        
        #Hair Parameters
        self.scale = 1.0
        self.trans = [0.0,0.0,0.0]
        self.dampening = 0.98
        self.tensor = 1.0
        self.gravity = [0.0,0.0,0.0]
        self.steps = 1
        self.density = density
        self.max_length = max_length
        self.length_scale = length_scale
        self.time_step = 1.0

        #Physics
        self.forces = [0.0,0.0,0.0]

        #Geometry
        self.particles = glLibGrid2D(self.size)
##        self.particles_mesh = glLibGrid2DMesh(self.size)
        self.particles_mesh = glLibDoubleGrid3DMesh([self.density*self.size[0],self.density*self.size[1],self.max_length])
##        self.particles_mesh = glLibDoubleGrid3DMesh([3,4,5])
        self.draw_particles = glLibGrid2D(sc_vec(self.density,self.size))
        
        #Textures
        self.position_length_textures = [glLibTexture2D(pos_length_surf,(0,0,self.size[0],self.size[1]),GL_RGBA,filtering=GLLIB_FILTER,precision=32)]
        self.grow_tex = glLibTexture2D(grow_surf,(0,0,self.size[0],self.size[1]),GL_RGB,precision=32)
        
        #FBOs
        self.update_framebuffers1 = []
        self.update_framebuffers2 = []
        self.grow_framebuffers = []
        for hair_segment in xrange(self.max_length):
            update_framebuffer1 = glLibFBO(self.size)
            update_framebuffer1.add_render_target(1,precision=32,filter=GLLIB_FILTER,type=GLLIB_RGBA)
            update_framebuffer1.add_render_target(2,precision=32,filter=GLLIB_FILTER)
            self.update_framebuffers1.append(update_framebuffer1)
            update_framebuffer2 = glLibFBO(self.size)
            update_framebuffer2.add_render_target(1,precision=32,filter=GLLIB_FILTER,type=GLLIB_RGBA)
            update_framebuffer2.add_render_target(2,precision=32,filter=GLLIB_FILTER)
            self.update_framebuffers2.append(update_framebuffer2)
            grow_framebuffer = glLibFBO(self.size)
            grow_framebuffer.add_render_target(1,precision=32,type=GLLIB_RGBA)
            self.grow_framebuffers.append(grow_framebuffer)

        #Shaders
        self.grow_shader = glLibShader()
        self.grow_shader.use_prebuilt(GLLIB_HAIR_GROW)
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_HAIR_UPDATE)
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_HAIR_DRAW)

        #Grow Hair
        self.glLibInternal_grow()

        #Initialize Position
        self.glLibInternal_initialize_position()
Exemplo n.º 5
0
    def __init__(self,n,precision=8):
        #self.n differs from n by a maximum of sqrt(n)+1
        self.size = [int(round(n**0.5))]*2
        self.n = self.size[0] * self.size[1]

        #Shader to update particles
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_PARTICLE_UPDATE)
##        print self.update_shader.errors

        #Shader to draw particles
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_PARTICLE_DRAW)
##        print self.draw_shader.errors

        #Particles as VBO
        self.particles = glLibGrid2D(self.size[0])

        #Parameters
        self.origin  = [0.0,0.0,0.0]
        self.initialspeed = [0.0,0.0,0.0]
        self.forces = [0.0,0.0,0.0]
        self.scale   = [1,1,1]
        self.density = 1.0
        self.step = 1.0/(self.n-1)
        self.density_constant = (1.0/64.0)*(4.0**log(self.size[0],2.0)) * self.step
        self.trans = [0.0,0.0,0.0]
        self.fade = 1.0
        self.jitter = [0.0,0.0,0.0]
        self.psize = 100.0
        #   Edge handling
        self.negx = 1.0
        self.negy = 1.0
        self.negz = 1.0
        self.posx = 1.0
        self.posy = 1.0
        self.posz = 1.0

        #Data Textures
        self.pos_time_texture = None
        self.velocity_texture = None

        self.view_2D = glLibView2D((0,0,self.size[0],self.size[1]))
        
        self.point_texture = glLibTexture2D(os.path.join("glLib","fireparticle.png"),(0,0,8,8),GLLIB_RGBA)
        self.point_texture.edge(GLLIB_CLAMP)

        self.precision = precision

        self.framebuffer1 = glLibFBO(self.size)
        self.framebuffer1.add_render_target(1,type=GLLIB_RGBA,precision=self.precision)
        self.framebuffer1.add_render_target(2,type=GLLIB_RGBA,precision=self.precision)

        self.framebuffer2 = glLibFBO(self.size)
        self.framebuffer2.add_render_target(1,type=GLLIB_RGBA,precision=self.precision)
        self.framebuffer2.add_render_target(2,type=GLLIB_RGBA,precision=self.precision)

        self.pingpong = 1

        xvalues = np.zeros(self.n)+0.5
        yvalues = np.zeros(self.n)+0.5
        zvalues = np.zeros(self.n)+0.5
        tvalues = np.arange(0.0, 1.0+(1.0/self.n), 1.0/(self.n-1.0)).astype(float)
        zeros = np.zeros(self.n)
        texarray = np.concatenate([xvalues,yvalues,zvalues,tvalues]).reshape(4,-1).T
        texarray = texarray.reshape((self.size[0],self.size[1],4))
        self.pos_time_texture = glLibTexture2D(texarray,(0,0,self.size[0],self.size[1]),GLLIB_RGBA)

        vecs = np.random.standard_normal(size=(self.size[0],self.size[1],3))
        magnitudes = np.sqrt((vecs*vecs).sum(axis=-1))
        uvecs = vecs / magnitudes[...,np.newaxis]
        randlen = np.random.random((self.size[0],self.size[1]))
        randvecs = uvecs*randlen[...,np.newaxis]
        rgb = ((randvecs+1.0)/2.0)*255.0
        surface = pygame.surfarray.make_surface(rgb)
        self.rand_tex = glLibTexture2D(surface,(0,0,self.size[0],self.size[1]),GLLIB_RGB)
        
        self.get_new = False
        self.update()
        self.get_new = True
Exemplo n.º 6
0
    def __init__(self, pos_length_surf, grow_surf, length_scale, max_length,
                 density):
        #Size
        self.size = list(pos_length_surf.get_size())

        #Misc.
        self.view_2d = glLibView2D((0, 0, self.size[0], self.size[1]))
        self.update_pingpong = 1

        #Hair Parameters
        self.scale = 1.0
        self.trans = [0.0, 0.0, 0.0]
        self.dampening = 0.98
        self.tensor = 1.0
        self.gravity = [0.0, 0.0, 0.0]
        self.steps = 1
        self.density = density
        self.max_length = max_length
        self.length_scale = length_scale
        self.time_step = 1.0

        #Physics
        self.forces = [0.0, 0.0, 0.0]

        #Geometry
        self.particles = glLibGrid2D(self.size)
        ##        self.particles_mesh = glLibGrid2DMesh(self.size)
        self.particles_mesh = glLibDoubleGrid3DMesh([
            self.density * self.size[0], self.density * self.size[1],
            self.max_length
        ])
        ##        self.particles_mesh = glLibDoubleGrid3DMesh([3,4,5])
        self.draw_particles = glLibGrid2D(sc_vec(self.density, self.size))

        #Textures
        self.position_length_textures = [
            glLibTexture2D(pos_length_surf, (0, 0, self.size[0], self.size[1]),
                           GL_RGBA,
                           filtering=GLLIB_FILTER,
                           precision=32)
        ]
        self.grow_tex = glLibTexture2D(grow_surf,
                                       (0, 0, self.size[0], self.size[1]),
                                       GL_RGB,
                                       precision=32)

        #FBOs
        self.update_framebuffers1 = []
        self.update_framebuffers2 = []
        self.grow_framebuffers = []
        for hair_segment in xrange(self.max_length):
            update_framebuffer1 = glLibFBO(self.size)
            update_framebuffer1.add_render_target(1,
                                                  precision=32,
                                                  filter=GLLIB_FILTER,
                                                  type=GLLIB_RGBA)
            update_framebuffer1.add_render_target(2,
                                                  precision=32,
                                                  filter=GLLIB_FILTER)
            self.update_framebuffers1.append(update_framebuffer1)
            update_framebuffer2 = glLibFBO(self.size)
            update_framebuffer2.add_render_target(1,
                                                  precision=32,
                                                  filter=GLLIB_FILTER,
                                                  type=GLLIB_RGBA)
            update_framebuffer2.add_render_target(2,
                                                  precision=32,
                                                  filter=GLLIB_FILTER)
            self.update_framebuffers2.append(update_framebuffer2)
            grow_framebuffer = glLibFBO(self.size)
            grow_framebuffer.add_render_target(1,
                                               precision=32,
                                               type=GLLIB_RGBA)
            self.grow_framebuffers.append(grow_framebuffer)

        #Shaders
        self.grow_shader = glLibShader()
        self.grow_shader.use_prebuilt(GLLIB_HAIR_GROW)
        self.update_shader = glLibShader()
        self.update_shader.use_prebuilt(GLLIB_HAIR_UPDATE)
        self.draw_shader = glLibShader()
        self.draw_shader.use_prebuilt(GLLIB_HAIR_DRAW)

        #Grow Hair
        self.glLibInternal_grow()

        #Initialize Position
        self.glLibInternal_initialize_position()