예제 #1
0
 def reset(self):
     self.pos_restrained_tex = self.original_pos_restrained_tex
     self.glLibInternal_initialize_position()
     self.velocity_tex = glLibTexture2D(None,
                                        (0, 0, self.size[0], self.size[1]),
                                        GL_RGB,
                                        precision=32)
     self.glLibInternal_initialize_position()
예제 #2
0
 def glLibInternal_calculate_obstacles(self):
     data1 = np.array(np.zeros((1, self.num_obstacles, 4)), "f")
     data2 = np.array(np.zeros((1, self.num_obstacles, 4)), "f")
     x = 0
     self.polygonal_object_textures = None
     for obstacle in self.collidable.values():
         position = list(obstacle[:3])
         position_type = list(
             map(lambda num: 0.5 * ((num + 1.0) / 2.0), position))
         type, param = obstacle[-1]
         if type == GLLIB_OBSTACLE_POLYGONAL:
             position_type[0] += 0.5
             color1 = [
                 position_type[0], position_type[1], position_type[2], 0.0
             ]
             color2 = [param[0].width, param[2], 0.0, 0.0]
             self.polygonal_object_textures = param[:-1]
         elif type == GLLIB_OBSTACLE_SPHERE:
             position_type[2] += 0.5
             color1 = [
                 position_type[0], position_type[1], position_type[2],
                 param / 2.0
             ]
             color2 = [0.0, 0.0, 0.0, 0.0]
         elif type == GLLIB_OBSTACLE_BOX:
             position_type[1] += 0.5
             color1 = [
                 position_type[0], position_type[1], position_type[2],
                 param[0]
             ]
             color2 = [
                 param[1], param[2], (param[3] % 360.0) / 360.0,
                 (param[4] % 360.0) / 360.0
             ]
         data1[0][x] = np.array(color1, "f")
         data2[0][x] = np.array(color2, "f")
         x += 1
     self.obstacles_tex = glLibTexture2D(data1,
                                         (0, 0, self.num_obstacles, 1),
                                         GL_RGBA,
                                         precision=32)
     self.obstacles_aux_param_tex = glLibTexture2D(
         data2, (0, 0, self.num_obstacles, 1), GL_RGBA, precision=32)
예제 #3
0
 def glLibInternal_calculate_obstacles(self):
     data1 = np.array(np.zeros((1, self.num_obstacles, 4)), "f")
     data2 = np.array(np.zeros((1, self.num_obstacles, 4)), "f")
     x = 0
     for obstacle in self.collidable.values():
         position = list(obstacle[:3])
         position_type = map(lambda num: 0.5 * ((num + 1.0) / 2.0), position)
         type, param = obstacle[-1]
         if type == GLLIB_OBSTACLE_SPHERE:
             position_type[2] += 0.5
             color1 = [position_type[0], position_type[1], position_type[2], param / 2.0]
             color2 = [0.0, 0.0, 0.0, 0.0]
         elif type == GLLIB_OBSTACLE_BOX:
             position_type[1] += 0.5
             color1 = [position_type[0], position_type[1], position_type[2], param[0]]
             color2 = [param[1], param[2], (param[3] % 360.0) / 360.0, (param[4] % 360.0) / 360.0]
         data1[0][x] = np.array(color1, "f")
         data2[0][x] = np.array(color2, "f")
         x += 1
     self.obstacles_tex = glLibTexture2D(data1, (0, 0, self.num_obstacles, 1), GL_RGBA, precision=32)
     self.obstacles_aux_param_tex = glLibTexture2D(data2, (0, 0, self.num_obstacles, 1), GL_RGBA, precision=32)
예제 #4
0
 def update(self):
     self.glLibInternal_push()
     self.glLibInternal_use_update_shader()
     for step in xrange(self.steps):
         self.update_shader.pass_bool("end",False)
         for hair_segment in xrange(1,self.max_length+1,1):
             if self.update_pingpong == 1:
                 if self.get_new:
                     if hair_segment == 1:
                         self.update_shader.pass_texture(self.position_length_textures[0],1)
                     else:
                         self.update_shader.pass_texture(self.update_framebuffers2[hair_segment-2].get_texture(1),1)
                     self.update_shader.pass_texture(self.update_framebuffers2[hair_segment-1].get_texture(1),2)
                     if hair_segment < self.max_length:
                         self.update_shader.pass_texture(self.update_framebuffers2[hair_segment].get_texture(1),3)
                     self.update_shader.pass_texture(self.update_framebuffers2[hair_segment-1].get_texture(2),4)
                 else:
                     self.update_shader.pass_texture(self.position_length_textures[hair_segment-1],1)
                     self.update_shader.pass_texture(self.position_length_textures[hair_segment+0],2)
                     if hair_segment < self.max_length:
                         self.update_shader.pass_texture(self.position_length_textures[hair_segment+1],3)
                     self.update_shader.pass_texture(glLibTexture2D(None,(0,0,self.size[0],self.size[1]),GL_RGB,precision=32),4)
                 self.update_framebuffers1[hair_segment-1].enable([1,2])
             else:
                 if hair_segment == 1:
                     self.update_shader.pass_texture(self.position_length_textures[0],1)
                 else:
                     self.update_shader.pass_texture(self.update_framebuffers1[hair_segment-2].get_texture(1),1)
                 self.update_shader.pass_texture(self.update_framebuffers1[hair_segment-1].get_texture(1),2)
                 if hair_segment < self.max_length:
                     self.update_shader.pass_texture(self.update_framebuffers1[hair_segment].get_texture(1),3)
                 self.update_shader.pass_texture(self.update_framebuffers1[hair_segment-1].get_texture(2),4)
                 
                 self.update_framebuffers2[hair_segment-1].enable([1,2])
             glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
             glLoadIdentity()
             self.view_2d.set_view()
             self.particles.draw()
             if self.update_pingpong == 1: self.update_framebuffers1[hair_segment-1].disable()
             else:                         self.update_framebuffers2[hair_segment-1].disable()
             if hair_segment == self.max_length-1:
                 self.update_shader.pass_bool("end",True)
         self.update_pingpong = 3 - self.update_pingpong
     glLibUseShader(None)
     self.glLibInternal_pop()
     self.forces = [0.0,0.0,0.0]
예제 #5
0
def glLibInternal_Material(filename,filtering,mipmapping):
    contents = {}
    mtl = None
    mtlfilename = os.path.join(*filename[:-1]+[filename[-1][:-4]+".mtl"])
    for line in open(mtlfilename, "r"):
        if line.startswith('#'): continue
        values = line.split()
        if not values: continue
        if values[0] == 'newmtl':
            mtl = contents[values[1]] = {}
        elif mtl is None:
            raise ValueError, "mtl file doesn't start with newmtl stmt"
        elif values[0] == 'map_Kd':
            surf = pygame.image.load(os.path.join(*filename[:-1]+[values[1]]))
            mtl['texture_Kd'] = glLibTexture2D(surf,GLLIB_ALL,GLLIB_RGBA,filtering,mipmapping)
        else:
            mtl[values[0]] = map(float, values[1:])
            if len(mtl[values[0]]) == 3: mtl[values[0]] = mtl[values[0]]+[1.0]
    return contents
예제 #6
0
def glLibInternal_Material(filename,name,filtering,mipmapping):
    contents = {}
    mtl = None
    for x in reversed(xrange(len(filename))):
        tel = filename[x]
        if tel != '/':
            filename = filename[:len(filename)-1]
        else:
            break

    #mtlfilename = os.path.join(*filename[:-1]+[name])
    mtlfilename = filename + name
    try:
        for line in open(mtlfilename, "r"):
            if line.startswith('#'): continue
            values = line.split()
            if not values: continue
            if values[0] == 'newmtl':
                mtl = contents[values[1]] = {}
            elif mtl is None:
                raise ValueError("mtl file doesn't start with newmtl stmt")
            elif values[0] == 'map_Kd':
                try:
                    #surf = pygame.image.load(os.path.join(*filename[:-1]+[values[1]]))
                    surf = pygame.image.load(filename+values[1])
                    mtl['texture_Kd'] = glLibTexture2D(surf,GLLIB_ALL,GLLIB_RGBA,filtering,mipmapping)
                except:
                    #raise glLibError("Cannot open "+os.path.join(*filename[:-1]+[values[1]])+"!")
                    raise glLibError("Cannot open "+filename+values[1])
            else:
                mtl[values[0]] = list(map(float, values[1:]))
                if len(mtl[values[0]]) == 3: mtl[values[0]] = mtl[values[0]]+[1.0]
##        glLibInternal_CheckMaterial(contents)
        return contents
    except IOError:
        raise glLibError(".mtl library "+mtlfilename+" not found!")
예제 #7
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()
예제 #8
0
 def reset(self):
     self.pos_restrained_tex = self.original_pos_restrained_tex
     self.glLibInternal_initialize_position()
     self.velocity_tex = glLibTexture2D(None, (0, 0, self.size[0], self.size[1]), GL_RGB, precision=32)
     self.glLibInternal_initialize_position()
예제 #9
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()
예제 #10
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
예제 #11
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()
예제 #12
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
예제 #13
0
    def update(self):
        self.glLibInternal_push()
        self.glLibInternal_use_update_shader()
        for step in xrange(self.steps):
            self.update_shader.pass_bool("end", False)
            for hair_segment in xrange(1, self.max_length + 1, 1):
                if self.update_pingpong == 1:
                    if self.get_new:
                        if hair_segment == 1:
                            self.update_shader.pass_texture(
                                self.position_length_textures[0], 1)
                        else:
                            self.update_shader.pass_texture(
                                self.update_framebuffers2[hair_segment -
                                                          2].get_texture(1), 1)
                        self.update_shader.pass_texture(
                            self.update_framebuffers2[hair_segment -
                                                      1].get_texture(1), 2)
                        if hair_segment < self.max_length:
                            self.update_shader.pass_texture(
                                self.update_framebuffers2[hair_segment].
                                get_texture(1), 3)
                        self.update_shader.pass_texture(
                            self.update_framebuffers2[hair_segment -
                                                      1].get_texture(2), 4)
                    else:
                        self.update_shader.pass_texture(
                            self.position_length_textures[hair_segment - 1], 1)
                        self.update_shader.pass_texture(
                            self.position_length_textures[hair_segment + 0], 2)
                        if hair_segment < self.max_length:
                            self.update_shader.pass_texture(
                                self.position_length_textures[hair_segment +
                                                              1], 3)
                        self.update_shader.pass_texture(
                            glLibTexture2D(None,
                                           (0, 0, self.size[0], self.size[1]),
                                           GL_RGB,
                                           precision=32), 4)
                    self.update_framebuffers1[hair_segment - 1].enable([1, 2])
                else:
                    if hair_segment == 1:
                        self.update_shader.pass_texture(
                            self.position_length_textures[0], 1)
                    else:
                        self.update_shader.pass_texture(
                            self.update_framebuffers1[hair_segment -
                                                      2].get_texture(1), 1)
                    self.update_shader.pass_texture(
                        self.update_framebuffers1[hair_segment -
                                                  1].get_texture(1), 2)
                    if hair_segment < self.max_length:
                        self.update_shader.pass_texture(
                            self.update_framebuffers1[hair_segment].
                            get_texture(1), 3)
                    self.update_shader.pass_texture(
                        self.update_framebuffers1[hair_segment -
                                                  1].get_texture(2), 4)

                    self.update_framebuffers2[hair_segment - 1].enable([1, 2])
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
                glLoadIdentity()
                self.view_2d.set_view()
                self.particles.draw()
                if self.update_pingpong == 1:
                    self.update_framebuffers1[hair_segment - 1].disable()
                else:
                    self.update_framebuffers2[hair_segment - 1].disable()
                if hair_segment == self.max_length - 1:
                    self.update_shader.pass_bool("end", True)
            self.update_pingpong = 3 - self.update_pingpong
        glLibUseShader(None)
        self.glLibInternal_pop()
        self.forces = [0.0, 0.0, 0.0]
예제 #14
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()