예제 #1
0
 def __init__(self, name):
     self.name = name
     self.position = vector3()
     self.rotation = quaternion(1, 0, 0, 0)
     self.scale = vector3(1, 1, 1)
     self.mesh = None
     self.material = None
     self.children = []
예제 #2
0
    def create_childlegend(size, mesh = None):
        if (mesh == None):
            mesh = Mesh("LegendaryLegend")

        Mesh.create_triangle(vector3(0, 0, -size[0] * 0.5), vector3(size[1] * 0.5 , 0, 0), vector3(0, -size[2] * 0.5, 0), mesh)
        Mesh.create_triangle(vector3(0, 0, size[0] * 0.5), vector3(size[1] * 0.5, 0, 0), vector3(0, -size[2] * 0.5, 0), mesh)

        Mesh.create_square(vector3(-size[0] * 0.5, 0, 0), vector3(0, -size[1] * 0.5, 0), vector3(0, 0, -size[2] * 0.5), mesh)
        Mesh.create_square(vector3(0, size[0] * 0.5, 0), vector3(size[1] * 0.5, 0, 0), vector3(0, 0, -size[2] * 0.5), mesh)
        Mesh.create_square(vector3(0, 0, 0), vector3(-size[1] * 0.5, -size[1] * 0.5, 0), vector3(0,0, -size[2] * 0.5), mesh)

        return mesh
예제 #3
0
 def __init__(self, game_object):
     self.game_object = game_object
     self.local_position = vector3()
     self.local_rotation = quaternion(1, 0, 0, 0)
     self.local_scale = vector3.one()
     self._parent = None
     self.children = []
예제 #4
0
    def create_sphere( self, rel_pos, radius, mat ):

        self.m = mat
        
        rel_pos /= voxel_tree.voxel_world_size
        radius /= voxel_tree.voxel_world_size
        radius_sq = radius * radius
        
        for x in range( int(self.dim.x * voxel_tree.mask_block_dim) ):
            for y in range( int(self.dim.y * voxel_tree.mask_block_dim) ):
                for z in range( int(self.dim.z * voxel_tree.mask_block_dim) ):
                    print x,y,z
                    ptsq = ( (x-rel_pos.x)*(x-rel_pos.x) +
                             (y-rel_pos.y)*(y-rel_pos.y) +
                             (z-rel_pos.z)*(z-rel_pos.z) )
                    if ptsq < radius_sq:
                        mask = ( 1 << ( (x % voxel_tree.dim.x) +
                                        (y % voxel_tree.dim.y) * mask_block_dim
                                        (z % voxel_tree.dim.z) * mask_block_dim_sq ) )
                        pos = vector3(x,y,z) / voxel_tree.mask_block_dim
                        mask_pos = int( (pos.x / voxel_tree.pos.x +
                                         pos.y * voxel_tree.dim.x +
                                         pos.z * voxel_tree.dim.x * voxel_tree.dim.y ) )

                        self.mask[ mask_pos ] |= mask
예제 #5
0
 def create_Cube(size, mesh = None):
     if (mesh == None):
         mesh = Mesh("Cube2")
         
         Mesh.create_square(vector3(-size[0] * 0.5, 0, 0), vector3(0, 0, size[2] * 0.5), vector3(0, size[1] * 0.5, 0), mesh)
         Mesh.create_square(vector3(size[0] * 0.5, 0, 0), vector3(0, 0, size[2] * 0.5), vector3(0, size[1] * 0.5, 0), mesh)
         Mesh.create_square(vector3(0, 0, size[2] * 0.5), vector3(-size[0] * 0.5, 0, 0), vector3(0, size[1] * 0.5, 0), mesh)
         Mesh.create_square(vector3(0, 0, -size[2] * 0.5), vector3(size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)
         
         return mesh
예제 #6
0
    def create_piramide(size, mesh=None):
        if (mesh == None):
            mesh = Mesh("UnknownCube")

        Mesh.create_triangulo(vector3(size[0] * 0.5, 0, 0),
                              vector3(0, size[1] * 0.5, 0),
                              vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_triangulo(vector3(0, size[1] * 0.5, 0),
                              vector3(size[0] * 0.5, 0),
                              vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_triangulo(vector3(0, 0, size[2] * 0.5),
                              vector3(size[0] * 0.5, 0),
                              vector3(0, size[1] * 0.5, 0), mesh)

        return mesh
예제 #7
0
    def __init__( self, out, screen, tile_size, generator ):

        #avoid our attribute management system
        self.recurse_attributes = False
        
        self.screen = screen
        
        self.window = screen.get_size()

        self.tile_size = tile_size
        self.tile_dim = ( self.window[0]/tile_size[0],
                          self.window[1]/tile_size[1] )
        
        self.window = ( self.tile_dim[0] * tile_size[0],
                        self.tile_dim[1] * tile_size[1] )
        
        self.start_rect = Rect( (0,0), tile_size)

        self.ts = ts = tile_size
        self.hts = hts = (ts[0]/2, ts[1]/2)

        self.areas = [ [ area.area( vector3( x*ts[0] + hts[0],
                                             y*ts[1] + hts[1],
                                             0 ),
                                    ts,
                                    potential = resource.resource(
                                                    food = generator(x, y),
                                                    wood = generator(x, y),
                                                    gold = generator(x, y),
                                                    stone = generator(x, y)
                                                                 )
                                   ) for y in range( self.tile_dim[1] )
                       ] for x in range( self.tile_dim[0] )
                     ]

        self.cities = [ city.city( vector3( x + (hts[0]-5) * random.random(),
                                            y + (hts[1]-5) * random.random(),
                                            0.0 ),
                                   out,
                                   area = self.get_area_at( x/ts[0], y/ts[1] ) )
                        for x in range(0, self.window[0], hts[0])
                        for y in range(0, self.window[1], ts[1])
                      ]
예제 #8
0
    def render(self, screen, matrix, material, obj, camarapos, light):        
        i=-1
        for poly in self.polygons:
            i=i+1
            tpoly = []
            for v in poly:
                vtemp = v + vector3(0,0,0)
                if(vtemp.z<camarapos.z):
                    vtemp.z=camarapos.z
                vout=vtemp.to_np4()
                vout = vout @ matrix
                tpoly.append( ( screen.get_width() * 0.5 + vout[0] / vout[3], screen.get_height() * 0.5 - vout[1] / vout[3]) )
                tpoly.append( ( screen.get_width() * 0.5 + vout[0] / vout[3], screen.get_height() * 0.5 - vout[1] / vout[3]) )

            ab=(poly[1].to_np4() @ obj.get_matrix())-(poly[0].to_np4() @ obj.get_matrix())
            abvec=vector3(0,0,0)
            abvec.x=ab[0]
            abvec.y=ab[1]
            abvec.z=ab[2]
            bc=(poly[2].to_np4() @ obj.get_matrix())-(poly[1].to_np4() @ obj.get_matrix())
            bcvec=vector3(0,0,0)
            bcvec.x=bc[0]
            bcvec.y=bc[1]
            bcvec.z=bc[2]
            n = vector3.cross(abvec, bcvec)
            np.cross
            centro = self.origins[i].to_np4()
            centro = centro @ obj.get_matrix()
            v=centro-camarapos.to_np4()
            normal=n.to_np4()
            

            if(np.dot( v, normal) < 0.0):
                if(centro[2] >= camarapos.z):
                    l= centro - light.to_np4()
                    li_intensity=max(0.05,-np.dot(l, normal))
                    li_intensity=min(li_intensity, 1)
                    cpoly=material.color
                    cpoly = cpoly.__mul__(li_intensity)
                    c = cpoly.tuple3()
                    pygame.draw.polygon(screen, c, tpoly, material.line_width)
예제 #9
0
    def __init__( self, screen_dim ):

        self.dim = screen_dim
        
        self.pos = vector3()
        self.look = vector3( 0., 0., -1. )
        self.up = vector3( 0., 1., 0. )
        
        self.fov = 70.0
        self.nearz = 0.1
        self.farz = 100.0

        self.render_start = pygame.time.get_ticks()

        d = pygame.display
        self.screen = d.set_mode( ( int(self.dim.x), int(self.dim.y) ),
                                  pygame.OPENGL | pygame.DOUBLEBUF, 32 )
        
        self.default_settings()
        self.perspective()
        self.world()
예제 #10
0
    def draw( self ):
        "Draw the grid as a background for other rendering"
        ts = self.tile_size
        rect = Rect( self.start_rect )
        
        for y in range( self.tile_dim[1] ):
            for x in range( self.tile_dim[0] ):
                area = self.areas[x][y]

                # sum of faction colors scaled by faction control in area
                color = vector3()
                for i in range( global_info.num_factions ):
                    
                    color += (global_info.faction_colors[i] *
                              (area.faction_control[i]/100.0))
                             
                pygame.draw.rect( self.screen, color.raw, rect )
                rect.move_ip( ts[0], 0 )

            rect.move_ip( -ts[0] * self.tile_dim[0] , ts[1] )

        for city in self.cities:

            #draw an outer white band
            pos = Rect( (city.pos.x, city.pos.y), (6,6) )
            pygame.draw.rect( self.screen, (255,255,255), pos )

            #select a ligher version of faction color
            if city.faction_ident == -1:
                color = (0,0,0)
            else:
                color = global_info.faction_colors[ city.faction_ident ]
                color = color + vector3(150, 150, 150)
                color.cut_max(255)
                color = color.raw

            #move the rect inside our outline
            pos.inflate_ip(-2,-2)

            pygame.draw.rect( self.screen, color, pos )
예제 #11
0
    def __init__(self, scene):
        "Arguments: scene object containing geometry"
        self.scene = scene

        # define screen dimensions
        self.w = 800
        self.h = 600

        self.hw = self.w/2
        self.hh = self.h/2
        self.distort = float(self.w) / float(self.h)

        #define viewing angle
        self.fov = 70.0 * math.pi / 180.0
        self.tanfov = math.tan( self.fov / 2.0 )

        #base at origin looking down z axis for now
        self.pos = vector3()
        self.look = vector3(0.0, 0.0, -1.0)
        self.up = vector3(0.0, 1.0, 0.0)
        self.right = self.look.crossp( self.up )

        self.screen = pygame.display.set_mode( (self.w,self.h), 0, 24 )
        self.screen.fill( (0,0,0) )
예제 #12
0
 def _create_mask( self, v ):
     """Returns: long representing bit mask of all the points the vector
     touches in crossing a mask block. v should be normalized"""
     
     mask = 0L
     start = vector3(0,0,0)
     if v.x < 0.0:   start.x = voxel_tree.mask_block_dim
     if v.y < 0.0:   start.y = voxel_tree.mask_block_dim
     if v.z < 0.0:   start.z = voxel_tree.mask_block_dim
     
     for i in range( 7 ):
         pos = start + (v * i);
         if pos.x < 4 and pos.x >=0 and pos.y < 4 and pos.y >=0 and pos.z < 4 and pos.z >= 0:
             shift = pos.x + pos.y * voxel_tree.mask_block_dim + pos.z * voxel_tree.mask_block_dim_sq
             mask = mask | ( 1 << int(shift) )
             
     return mask
예제 #13
0
    def create_cube(size, mesh = None):
        if (mesh == None):
            mesh = Mesh("UnknownCube")
         # face da direita e da esquerda
        #Mesh.create_quad(vector3( size[0] * 0.5, 0, 0), vector3(0, -size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        #Mesh.create_quad(vector3(-size[0] * 0.5, 0, 0), vector3(0,  size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_quad(vector3(size[0] * 0.5, 0, 0), vector3(0,  size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        
        #face de cima e de baixo
        #Mesh.create_quad(vector3(0,  size[1] * 0.5, 0), vector3(size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_quad(vector3(0, -size[1] * 0.5, 0), vector3(-size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
     
        #face da frente e de trás
        #Mesh.create_quad(vector3(0, 0,  size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_quad(vector3(0, 0, -size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)
        


        return mesh
예제 #14
0
    def get_shade(self, scene, point):
        """Returns: shade factor that should be used for all contributions
                    from this light
        """
        shade = 0.0

        #use eccentricities to determine if we're likely to hit anything
        self_ecc = math.sqrt( self.w**2 + self.d**2 )
        eccs = scene.get_augmented_eccentricities(point, self.p)

        #try to get out of here quickly
        min_eccs = min(eccs)

        #if the minimum eccentricity is less than ours then no part
        #of the light will be blocked
        if min_eccs[0] > self_ecc:
            return 1.0

        #if the minimum eccentricity is less than the negation of ours
        #we'll never make it positive, all light will be blocked
        if min_eccs[0] < -self_ecc:
            return 0.0

        #regardless we only need to collide our many light rays with
        #geometry that could possibly intersect them
        necessary = [x[1] for x in eccs if x[0] < self_ecc and x[0] > -self_ecc]
        scene.select_collides( necessary )

        #compute some points around out point intervals based on a random factor
        points = [ self.p + vector3( self.dx*x + random() * self.dx,
                                     0.0,
                                     self.dz*z + random() * self.dz )
                   for z in range(square_light.dimension_shade)
                   for x in range(square_light.dimension_shade) ]

        #check each precomputed point to see if have sight of point
        #get approximate fraction of light visible from point
        for light_point in points:
            if not scene.is_blocked( point, light_point ):
                shade += self.contribution

        #reset scene to collide with everything
        scene.select_collides()

        return shade
예제 #15
0
    def unpack( data ):

        l = len( data )
        s = struct.calcsize( '!i' )
        if s > l:
            return None, data
        
        length, = struct.unpack( '!i', data[:s] )
        if length > l:
            return None, data


        header_data = data[:action.header_length]
        l,code,r,g,b = struct.unpack( action.header_format, header_data )
        try:
            act = action.actions[ code ]( code, vector3(r,g,b) )
        except KeyError, e:
            print "Unknown action code, error: ", e
예제 #16
0
    def __init__( self, leader, **keys ):

        self.leader = leader
        self.pos = vector3()
        
        # set initial values
        self.deviance = 0
        
        self.size = 0
        self.military = 0

        # update based on passed parameter
        super(party, self).__init__( keys )

        self.possible_actions[ "build_city" ] = [ (self.build_city,
                                                   None,
                                                   [ faction.faction,
                                                     city.city ]) ]
예제 #17
0
    def render_ray(self, xfactor, yfactor):
        "Renders a single ray at the fraction of the screen specified"
        
        #generate ray for this pixel
        d = ( self.look + self.right * xfactor * self.tanfov +
              self.up * -yfactor * self.tanfov )
        r = shapes.ray(self.pos, d)

        intersect = self.scene.collide( r )

        #see if we managed to hit anything
        if not intersect:
            self.intersect_info = ()
            return vector3()

        color = intersect.surf.m.color( self.scene, intersect, self.pos )
        self.intersect_info = intersect.surf.m.info
        return color
예제 #18
0
    def create_cube(size, mesh=None):
        if (mesh == None):
            mesh = Mesh("UnknownCube")

        #Mesh.create_quad(vector3( size[0] * 0.5, 0, 0), vector3(0, -size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        #Mesh.create_quad(vector3(-size[0] * 0.5, 0, 0), vector3(0,  size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)

        #Mesh.create_quad(vector3(0,  size[1] * 0.5, 0), vector3(size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)
        #Mesh.create_quad(vector3(0, -size[1] * 0.5, 0), vector3(-size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)

        #Mesh.create_quad(vector3(0, 0,  size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)
        #Mesh.create_quad(vector3(0, 0, -size[2] * 0.5), vector3( size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)

        Mesh.create_quad(vector3(0, 0, -size[2] * 0.5),
                         vector3(-size[0] * 0.5, 0),
                         vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_quad(vector3(size[0] * 0.5, 0, 0),
                         vector3(0, size[1] * 0.5, 0),
                         vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_quad(vector3(0, -size[1] * 0.5, 0),
                         vector3(-size[0] * 0.5, 0),
                         vector3(0, 0, size[2] * 0.5), mesh)

        return mesh
예제 #19
0
    def __init__( self, **keys ):

        self.pos = vector3()

        # set initial values
        self.faction_ident = 0
        self.morality = 0
        self.ambition = 0

        self.goals = []

        self.actions = []
        self.possible_actions = {}
        self.possible_actions[ "move" ] = [ (self.move,
                                             None,
                                             [ vector3 ]) ]
                                   
        self.actions = []

        # update based on passed parameter
        super(person, self).__init__( keys )
 def back(self):
     return vector3.from_np(vector3(0,0,-1).to_np4(0) @ self.get_matrix())
예제 #21
0
from vector3 import *

#create a random number generator
class random_generator:
    def __init__(self, minimum, maximum):
        self.mi = minimum
        self.ma = maximum
        
    def __call__(self, *args):
        return (random.random() * (self.ma-self.mi)) + self.mi


#create some information about the factions we're going to create
info = global_info.global_info()
info.num_factions = 4
info.faction_colors = [ vector3(255,0,0), vector3(0,0,255),
                        vector3(255,255,0), vector3(0,255,255) ]
info.faction_names = [ "orcs", "humans", "elves", "fairies" ]

grid.global_info = info
area.global_info = info

#initialize pygame
pygame.init()
screen = pygame.display.set_mode( (800,600), 0, 24 )
screen.fill( (0,0,0) )

#create information display structures
out = output.output( screen, 14 )
world = grid.grid( out, screen, (64,64), random_generator(10000, 15000) )
예제 #22
0
import event_handler
import network
import world

server = False
for arg in sys.argv:
    
    if arg == '-s' or arg == '-server':
        server = True

try:
    if server:  net = network.server( constants.port )
    else:       net = network.client( "pymud.no-ip.org", constants.port )
except AttributeError, e:
    print "ERROR: in connection, %s" % e
    sys.exit(-1)

pygame.init()
rend = renderer.renderer( vector3( constants.width, constants.height ) )
hand = event_handler.handler()
scene = world.world( rend, hand, net )

while True:
    
    event = hand.process()
    if event and event.type == pygame.QUIT:
        break
    scene.update()
    
pygame.quit()
예제 #23
0
 def test_one(self):
     p = vector3()
     d = vector3(0.0, 0.0, -1.0)
     self.scene.collide( shapes.ray(p, d) )
     return
예제 #24
0
 def right(self):
     return vector3.from_np(vector3(1, 0, 0).to_np4(0) @ self.get_matrix())
예제 #25
0
 def forward(self):
     return vector3.from_np(vector3(0, 0, 1).to_np4(0) @ self.get_matrix())
예제 #26
0
    def create_pyramid(size, mesh = None):
        if (mesh == None):
            mesh = Mesh("UnknownPyramid")

        Mesh.create_quad(vector3(0, -size[1] * 0.5, 0), vector3(-size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)

        #traz/frente
        Mesh.create_tria(vector3(0, 0,  size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), vector3(0, 0, -size[2] * 0.5), mesh)
        Mesh.create_tria(vector3(0, 0, -size[2] * 0.5), vector3( size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), mesh)

        #direita/esquerda
        Mesh.create_tria(vector3( size[0] * 0.5, 0, 0), vector3( 0, 0,  size[2] * 0.5), vector3(0, size[1] * 0.5, 0), vector3(-size[0] * 0.5, 0, 0), mesh)
        Mesh.create_tria(vector3(-size[0] * 0.5, 0, 0), vector3( 0, 0, -size[2] * 0.5), vector3(0, size[1] * 0.5, 0), vector3( size[0] * 0.5, 0, 0), mesh)
        return mesh
예제 #27
0
    def create_pyr(size, mesh=None):
        if (mesh == None):
            mesh = Mesh("UnknownPyr")

        Mesh.create_trig(vector3(0, size[1] * 0.5, 0),
                         vector3(size[0] * 0.5, 0, 0),
                         vector3(-size[0] * 0.5, 0, 0), mesh)  # ACB
        Mesh.create_trig(vector3(0, size[1] * 0.5, 0),
                         vector3(-size[0] * 0.5, 0, 0),
                         vector3(0, 0, size[2] * 0.5), mesh)  # ABD
        Mesh.create_trig(vector3(0, size[1] * 0.5, 0),
                         vector3(size[0] * 0.5, 0, 0),
                         vector3(0, 0, size[2] * 0.5), mesh)  # ACD
        Mesh.create_trig(vector3(-size[0] * 0.5, 0, 0),
                         vector3(size[0] * 0.5, 0, 0),
                         vector3(0, 0, size[2] * 0.5), mesh)  # BCD

        return mesh
예제 #28
0
    def create_pol(size, mesh = None):
        if (mesh == None):
            mesh = Mesh("UnknownPol")

        #quadrados direita
        Mesh.create_quad(vector3( size[0] * 0.5, 0, 0), vector3(0, -size[1] * 0.25, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3( size[0] * 0.25, size[1] * 0.40, 0), vector3(0, size[1] * 0.125, 0), vector3(0, 0, -size[2] * 0.5), vector3(size[0] * 0.25,0,0), mesh)
        Mesh.create_quad(vector3( size[0] * 0.5, -size[1] * 0.40, 0),vector3(0, size[1] * 0.125, 0), vector3(0, 0, -size[2] * 0.5), vector3(-size[0] * 0.25,0,0), mesh)

        #quadrados esquerda
        Mesh.create_quad(vector3(-size[0] * 0.5, 0, 0), vector3(0,  size[1] * 0.25, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3(-size[0] * 0.25, size[1] * 0.40, 0), vector3(0, size[1] * 0.125, 0), vector3(0, 0, size[2] * 0.5), vector3(-size[0] * 0.25,0,0),mesh)
        Mesh.create_quad(vector3(-size[0] * 0.5, -size[1] * 0.40, 0), vector3(0, size[1] * 0.125, 0), vector3(0, 0, size[2] * 0.5), vector3(size[0] * 0.25,0,0),mesh)

        #quadrados baixo e cima
        Mesh.create_quad(vector3(0,  size[1] * 0.5, 0), vector3(size[0] * 0.25, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3(0, -size[1] * 0.5, 0), vector3(-size[0] * 0.25, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)

        #quadrados frente e traz
        Mesh.create_hex(vector3(0, 0,  size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_hex(vector3(0, 0, -size[2] * 0.5), vector3( size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), mesh)

        return mesh
예제 #29
0
 def __init__(self, name):
     self.name = name
     self.position = vector3()
예제 #30
0
    def create_cube(size, mesh = None):
        if (mesh == None):
            mesh = Mesh("UnknownCube")

        #quadrados esquerda e direita
        Mesh.create_quad(vector3( size[0] * 0.5, 0, 0), vector3(0, -size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3(-size[0] * 0.5, 0, 0), vector3(0,  size[1] * 0.5, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)

        #quadrados baixo e cima
        Mesh.create_quad(vector3(0,  size[1] * 0.5, 0), vector3(size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3(0, -size[1] * 0.5, 0), vector3(-size[0] * 0.5, 0), vector3(0, 0, size[2] * 0.5), vector3(0,0,0), mesh)

        #quadrados frente e traz
        Mesh.create_quad(vector3(0, 0,  size[2] * 0.5), vector3(-size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), vector3(0,0,0), mesh)
        Mesh.create_quad(vector3(0, 0, -size[2] * 0.5), vector3( size[0] * 0.5, 0), vector3(0, size[1] * 0.5, 0), vector3(0,0,0), mesh)

        return mesh
예제 #31
0
import pygame
from pygame.locals import *

from vector3 import *

colors = [ vector3( r, g, b )
           for r in range(0, 256, 64)
           for g in range(0, 256, 64)
           for b in range(0, 256, 64) ]

image = pygame.image.load( "run.bmp" )

size = image.get_size()
screen = pygame.display.set_mode( size )
screen.blit( image, (0,0) )

for x in range( size[0] ):
    for y in range( size[1] ):

        pixel = raw_to_vec3( screen.get_at( (x,y) ) )
        
        closest = None
        distsqd = 1000000000000.0

        for c in colors:
            ds = ( pixel - c ).mag_squared()

            if ds < distsqd:
                distsqd = ds
                closest = c
예제 #32
0
    def collide( self, ray ):
        
        coll = collision( ray )
        ray_d = ray.d

        start = ray.s - self.pos
        if not self.dim.contains( start ):
            
            #compute distance ray must travel in each direction and divide by speed in that dir
            minbounds = -start
            maxbounds = -start + vector3( self.dim.x, self.dim.y, self.dim.z )

            t = minbounds.component_div(ray_d).raw_list
            t.extend( maxbounds.component_div(ray_d).raw_list )
            
            #cut out all t values behind start point and that aren't actually in voxel space
            t = [ i for i in t if i > 0.0 ]
            t = [ i for i in t if self.dim.contains( ray.s + ray_d * i ) ]
            if not len(t):   return coll()

            # take closest t value
            t.sort()
            t = t.pop()
            start = ray.s + ray_d * t
        
        diff = start - self.pos
        mask = self._create_mask( ray.d )
        
        #scale d so direction of maximum increase increases in steps of mask_block_dim
        m = max( enumerate( ray.d.raw ) , key = lambda t: t.__getitem__(1) )
        scale = voxel_tree.mask_block_dim / m[ 1 ]
        d = ray_d * scale

        #create pos as integer coordinate in mask, dp as sub position
        p = diff / voxel_tree.voxel_world_size / voxel_tree.mask_block_dim
        pos = vector3( int(p.x), int(p.y), int(p.z) )
        dp = ( pos - p ) * voxel_tree.mask_block_dim
        
        while self.dim.contains( pos ):
            #find the shift for the ray's mask and the mask-block that we're at
            mask_shift = int(dp.x + dp.y * voxel_tree.mask_block_dim + dp.z * voxel_tree.mask_block_dim_sq )
            mask_pos = int(pos.x + pos.y * voxel_tree.dim.x + pos.z * voxel_tree.dim.x * voxel_tree.dim.y )

            #find the actual two masks
            ray_mask = mask >> mask_shift
            geo_mask = self.mask[ mask_pos ]

            #if there is any overlap, there is a collision here
            if ray_mask & geo_mask:
                overlap = ray_mask & geo_mask

                p = 0
                while overlap:
                    p += 1
                    overlap = overlap >> 1

                z = p / voxel_tree.mask_block_dim_sq
                y = (p - z*voxel_tree.mask_block_dim_sq) / voxel_tree.mask_block_dim
                x = (p - z*voxel_tree.mask_block_dim_sq - y*voxel_tree.mask_block_dim) / voxel_tree.mask_block_dim

                hit = pos*voxel_tree.mask_block_dim*voxel_tree.voxel_world_size
                hit += vector3(x,y,z)*voxel_tree.voxel-world_size
                t = (hit - ray.s).mag()
                return coll( True, self, t )

            #increase along ray direction and then find the direction that
            #it moved out of this mask block first
            new_dp = dp + d
            out_of_bounds = (new_dp - mask_dim).component_div( d )
            m = max( enumerate( out_of_bounds.raw ), key = lambda t: t.__getitem__(1) )

            #position dp at the edge of the mask block
            t = ( voxel_tree.mask_block_dim - dp.raw[ m[0] ] ) / ld
            dp += d * t

            #increase pos which control with mask block we're looking at
            # then reset the submask-block index in that direction
            pos.modify( m[0], 1 )
            dp.modify( m[0], -voxel_tree.mask_block_dim )
                 
            
        #passed outside of voxel space, no collision
        return coll()
예제 #33
0
 def get_position(self):
     return vector3.from_np(vector3(0, 0, 0).to_np4(1) @ self.get_matrix())
예제 #34
0
    def create_Pyramid(size, mesh=None):
        if (mesh == None):
            mesh = Mesh("Pyramid")

        Mesh.create_triangle(vector3(-size[0] * 0.5, 0, 0),
                             vector3(0, 0, size[2] * 0.5),
                             vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_triangle(vector3(size[0] * 0.5, 0, 0),
                             vector3(0, 0, size[2] * 0.5),
                             vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_triangle(vector3(0, 0, size[2] * 0.5),
                             vector3(-size[0] * 0.5, 0),
                             vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_triangle(vector3(0, 0, -size[2] * 0.5),
                             vector3(size[0] * 0.5, 0),
                             vector3(0, size[1] * 0.5, 0), mesh)

        Mesh.create_square(vector3(0, -size[1] * 0.5, 0),
                           vector3(-size[0] * 0.5, 0),
                           vector3(0, 0, size[2] * 0.5), mesh)
        return mesh
예제 #35
0
 def up(self):
     return vector3.from_np(vector3(0, 1, 0).to_np4(0) @ self.get_matrix())
예제 #36
0
import pygame

from vector3 import *
import shapes, voxel, scene, render, material

#create some materials
red_mat = material.material( vector3(),                     #emissive
                             vector3(96.0, 66.0, 66.0),     #ambient
                             vector3(96.0, 66.0, 66.0),     #diffuse
                             vector3(),                     #specular
                             20.0,                          #shininess
                             0.0 )                          #reflectivity

grey_mat = material.material( vector3(),
                              vector3(96.0, 96.0, 96.0),
                              vector3(96.0, 96.0, 96.0),
                              vector3(),
                              20.0,
                              0.0 )

bluegrey_mat = material.material( vector3(),
                                  vector3(66.0, 66.0, 96.0),
                                  vector3(66.0, 66.0, 96.0),
                                  vector3(),
                                  20.0,
                                  0.0 )

orange_mat = material.material( vector3(),
                                vector3(238.0, 154.0, 73.0),
                                vector3(238.0, 154.0, 73.0),
                                vector3(255.0, 255.0, 255.0),
예제 #37
0
    def create_Cube(size, mesh=None):
        if (mesh == None):
            mesh = Mesh("Cube")
        #lados
        Mesh.create_square(vector3(size[0] * 0.5, 0, 0),
                           vector3(0, -size[1] * 0.5, 0),
                           vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_square(vector3(-size[0] * 0.5, 0, 0),
                           vector3(0, size[1] * 0.5, 0),
                           vector3(0, 0, size[2] * 0.5), mesh)
        #cima baixo
        Mesh.create_square(vector3(0, size[1] * 0.5, 0),
                           vector3(size[0] * 0.5, 0),
                           vector3(0, 0, size[2] * 0.5), mesh)
        Mesh.create_square(vector3(0, -size[1] * 0.5, 0),
                           vector3(-size[0] * 0.5, 0),
                           vector3(0, 0, size[2] * 0.5), mesh)
        #frente tras
        Mesh.create_square(vector3(0, 0, size[2] * 0.5),
                           vector3(-size[0] * 0.5, 0),
                           vector3(0, size[1] * 0.5, 0), mesh)
        Mesh.create_square(vector3(0, 0, -size[2] * 0.5),
                           vector3(size[0] * 0.5, 0),
                           vector3(0, size[1] * 0.5, 0), mesh)

        return mesh
 def left(self):
     return vector3.from_np(vector3(-1,0,0).to_np4(0) @ self.get_matrix())