Пример #1
0
    def __init__(self,
                 mapfile,
                 xpos,
                 zpos,
                 emap,
                 width=10.0,
                 depth=10.0,
                 height=10.0,
                 name="building",
                 draw_details=None,
                 yoff=0.0,
                 scheme=None):
        """
    Creates a building at the given location. Each pixel of the image is one cell of the building
    If the cell is white then the cell is open, if it is black then it is wall. If it is grey
    then it is open and has no ceiling.
    The building is centred at xpos, zpos (which gets renamed herin to x,y to match the image coords)
    Each cell is width on the x axis and depth on the z axis, and the walls are height high on the y axis.

    The function returns a merged shape with the entire building in it.
    """
        self.xpos = xpos
        self.zpos = zpos
        self.width = width
        self.depth = depth
        self.height = height
        self.name = name
        self.ceilingthickness = 1.0
        self.walls = []

        if scheme == None:
            self.scheme = Building.baseScheme
        else:
            self.scheme = scheme

        # We don't have to be rigorous here, this should only be a draw_details or an iterable of draw_details.
        if hasattr(draw_details, "__getitem__") or hasattr(
                draw_details, "__iter__"):
            assert (len(draw_details) == self.scheme["#models"])
            self.details = draw_details
        else:
            self.details = [
                draw_details for x in range(self.scheme["#models"])
            ]
        # having a method like this allows draw details to be set later

        self.yoff = yoff

        self.model = [
            MergeShape(name=name + "." + str(x))
            for x in range(self.scheme["#models"])
        ]

        if mapfile[0] != '/':
            mapfile = sys.path[0] + '/' + mapfile
        print("Loading building map ...", mapfile)

        im = Image.open(mapfile)
        im = ImageOps.invert(im)
        ix, iy = im.size

        print("image size", ix, ",", iy)

        startx = xpos - ix / 2 * width
        starty = zpos - ix / 2 * depth

        yoff += emap.calcHeight(-xpos, -zpos)

        if not im.mode == "P":
            im = im.convert('P', palette=Image.ADAPTIVE)
        im = im.transpose(Image.FLIP_TOP_BOTTOM)
        im = im.transpose(Image.FLIP_LEFT_RIGHT)
        pixels = im.load()

        for y in range(1, iy - 1):
            print(".", end='')
            for x in range(1, ix - 1):
                colour = pixels[x, y]

                if x == 1:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty,
                                        (colour, pixels[x - 1, y], "edge"),
                                        wallfunc=self.west_wall,
                                        ceilingedgefunc=self.west_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)
                else:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty, (colour, pixels[x - 1, y]),
                                        wallfunc=self.west_wall,
                                        ceilingedgefunc=self.west_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)

                if x == ix - 2:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty,
                                        (colour, pixels[x + 1, y], "edge"),
                                        wallfunc=self.east_wall,
                                        ceilingedgefunc=self.east_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)
                else:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty, (colour, pixels[x + 1, y]),
                                        wallfunc=self.east_wall,
                                        ceilingedgefunc=self.east_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)

                if y == 1:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty,
                                        (colour, pixels[x, y - 1], "edge"),
                                        wallfunc=self.south_wall,
                                        ceilingedgefunc=self.south_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)
                else:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty, (colour, pixels[x, y - 1]),
                                        wallfunc=self.south_wall,
                                        ceilingedgefunc=self.south_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)

                if y == iy - 2:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty,
                                        (colour, pixels[x, y + 1], "edge"),
                                        wallfunc=self.north_wall,
                                        ceilingedgefunc=self.north_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)
                else:
                    self._executeScheme(x,
                                        y,
                                        startx,
                                        starty, (colour, pixels[x, y + 1]),
                                        wallfunc=self.north_wall,
                                        ceilingedgefunc=self.north_edge,
                                        ceilingfunc=self.ceiling,
                                        rooffunc=self.roof)

                self._executeScheme(x,
                                    y,
                                    startx,
                                    starty, (colour, None),
                                    wallfunc=None,
                                    ceilingedgefunc=None,
                                    ceilingfunc=self.ceiling,
                                    rooffunc=self.roof)

        self.set_draw_details(self.details)  # after models created otherwise
Пример #2
0
matsh = Shader("shaders/mat_reflect")
flatsh = Shader("shaders/uv_flat")

#Create textures
shapeimg = Texture("textures/straw1.jpg")
shapebump = Texture("textures/mudnormal.jpg")
waterbump = []
iFiles = glob.glob("textures/water/n_norm???.png")
iFiles.sort() # order is vital to animation!
for f in iFiles:
  waterbump.append(Texture(f))
num_n = len(waterbump)
shapeshine = Texture("textures/stars.jpg")

#Create shape
myshape = MergeShape()
num = (2, 2)
asphere = Sphere(sides=32)
for i in range(num[0]):
  for j in range(num[1]):
    myshape.add(asphere, -num[0]*0.9 + 1.8*i, -num[1]*0.9 +1.8*j, 0.0)

myshape.position(0.0, 0.0, 5)
myshape.set_draw_details(shader, [shapeimg, shapebump, shapeshine], 1.0, 0.1)
myshape.set_material((1.0, 0.5, 0.2, 0.5))

mywater = Plane(w=130.0, h=130.0)
mywater.set_draw_details(matsh, [waterbump[0], shapeshine], 12.0, 0.6)
mywater.set_material((0.0, 0.05, 0.1))
mywater.set_fog((0.4, 0.6, 0.8, 0.0),150)
mywater.rotateToX(90.001)
Пример #3
0
myecube = EnvironmentCube(900.0,"FACES")

light = Light(0, 10,10,10, "", 0,100,0)
light.on()

# Create elevation map
mapwidth=1000.0
mapdepth=1000.0
mapheight=60.0
mountimg1 = texs.loadTexture("textures/mountains3_512.jpg")
mymap = ElevationMap("textures/mountainsHgt.jpg",mapwidth,mapdepth,mapheight,64,64) #testislands.jpg

#Create tree models
treeplane = Plane(4.0,5.0)

treemodel1 = MergeShape("baretree")
treemodel1.add(treeplane, 0,0,0)
treemodel1.add(treeplane, 0,0,0, 0,90,0)

treemodel2 = MergeShape("bushytree")
treemodel2.add(treeplane, 0,0,0)
treemodel2.add(treeplane, 0,0,0, 0,60,0)
treemodel2.add(treeplane, 0,0,0, 0,120,0)

#Create grass model
grassplane = Plane(1.0,0.3,"",0,-2,0)
grassmodel = MergeShape("grass")
grassmodel.add(grassplane, 0,0,0)
grassmodel.add(grassplane, 0,0,0, 0,60,0)
grassmodel.add(grassplane, 0,0,0, 0,120,0)
Пример #4
0
mymap = ElevationMap("textures/maze1.jpg",
                     width=mapwidth,
                     depth=mapdepth,
                     height=mapheight,
                     divx=128,
                     divy=128,
                     name="sub")
mymap.set_draw_details(shader, [rockimg1, rockimg2, shineimg], 128.0, 0.05)

# Create fog for more realistic fade in distance. This can be turned on and off between drawing different object (i.e backgound not foggy)
mymap.set_fog((0.1, 0.1, 0.1, 1.0), 200.0)

#Create tree models
treeplane = Plane(w=4.0, h=5.0)

treemodel1 = MergeShape(name="baretree")
treemodel1.add(treeplane.buf[0], 0, 0, 0)
treemodel1.add(treeplane.buf[0], 0, 0, 0, 0, 90, 0)

#Scatter them on map using Merge shape's cluster function
mytrees1 = MergeShape(name="trees1")
mytrees1.cluster(treemodel1.buf[0], mymap, 0.0, 0.0, 900.0, 900.0, 10, "", 8.0,
                 3.0)
mytrees1.buf[0].set_draw_details(shader, [tree2img, rockimg2], 4.0, 0.0)
mytrees1.set_fog((0.1, 0.1, 0.1, 1.0), 200.0)

raspberry = MergeShape(name="rasp")
raspberry.cluster(treemodel1.buf[0], mymap, -250, +250, 470.0, 470.0, 5, "",
                  8.0, 1.0)
raspberry.buf[0].set_draw_details(shader, [raspimg, raspimg], 1.0, 0.0)
raspberry.set_fog((0.1, 0.1, 0.1, 1.0), 200.0)
Пример #5
0
ortho_cam = Camera(is_3d=False) # 2d orthographic view camera

#setup textures, light position and initial model position
Light((0, 5, 0))
#create shaders
shader = Shader("shaders/uv_reflect")
flatsh = Shader("shaders/uv_flat")
defocus = Defocus()

#Create textures
shapeimg = Texture("textures/straw1.jpg")
shapebump = Texture("textures/floor_nm.jpg", True)
shapeshine = Texture("textures/pong3.png")

#Create shape
myshape = MergeShape(camera=persp_cam) #specify perspective view
asphere = Sphere(sides=16, slices=16)
myshape.radialCopy(asphere, step=72)
myshape.position(0.0, 0.0, 5.0)
myshape.set_draw_details(shader, [shapeimg, shapebump, shapeshine], 8.0, 0.1)

mysprite = Sprite(w=10.0, h=10.0, camera=persp_cam)
mysprite.position(0.0, 0.0, 15.0)
mysprite.set_draw_details(flatsh, [shapebump])

tick=0
next_time = time.time()+2.0

#load ttf font and set the font colour to 'raspberry'
arialFont = Ttffont("fonts/FreeMonoBoldOblique.ttf", "#dd00aa")
mystring = String(font=arialFont, string="blurring with distance!",
Пример #6
0
mountimg1 = Texture("textures/mountains3_512.jpg")
mymap = ElevationMap("textures/mountainsHgt.jpg",
                     name="map",
                     width=mapwidth,
                     depth=mapdepth,
                     height=mapheight,
                     divx=32,
                     divy=32)  #testislands.jpg
mymap.buf[0].set_draw_details(shader, [mountimg1, bumpimg, reflimg], 128.0,
                              0.0)
mymap.set_fog(*FOG)

#Create tree models
treeplane = Plane(w=4.0, h=5.0)

treemodel1 = MergeShape(name="baretree")
treemodel1.add(treeplane.buf[0], 0, 0, 0)
treemodel1.add(treeplane.buf[0], 0, 0, 0, 0, 90, 0)

treemodel2 = MergeShape(name="bushytree")
treemodel2.add(treeplane.buf[0], 0, 0, 0)
treemodel2.add(treeplane.buf[0], 0, 0, 0, 0, 60, 0)
treemodel2.add(treeplane.buf[0], 0, 0, 0, 0, 120, 0)

#Scatter them on map using Merge shape's cluster function
mytrees1 = MergeShape(name="trees1")
mytrees1.cluster(treemodel1.buf[0], mymap, 0.0, 0.0, 120.0, 120.0, 30, "", 8.0,
                 3.0)
mytrees1.set_draw_details(flatsh, [tree2img], 0.0, 0.0)
mytrees1.set_fog(*TFOG)
Пример #7
0
# Create elevation map
mapwidth = 1000.0
mapdepth = 1000.0
mapheight = 60.0
mountimg1 = Texture("textures/mountains3_512.jpg")
mymap = ElevationMap("textures/mountainsHgt.jpg", name="map",
                     width=mapwidth, depth=mapdepth, height=mapheight,
                     divx=32, divy=32) #testislands.jpg
mymap.buf[0].set_draw_details(shader, [mountimg1, bumpimg, reflimg], 128.0, 0.0)
mymap.set_fog(*FOG)

#Create tree models
treeplane = Plane(w=4.0, h=5.0)

treemodel1 = MergeShape(name="baretree")
treemodel1.add(treeplane.buf[0], 0,0,0)
treemodel1.add(treeplane.buf[0], 0,0,0, 0,90,0)

treemodel2 = MergeShape(name="bushytree")
treemodel2.add(treeplane.buf[0], 0,0,0)
treemodel2.add(treeplane.buf[0], 0,0,0, 0,60,0)
treemodel2.add(treeplane.buf[0], 0,0,0, 0,120,0)

#Scatter them on map using Merge shape's cluster function
mytrees1 = MergeShape(name="trees1")
mytrees1.cluster(treemodel1.buf[0], mymap,0.0,0.0,200.0,200.0,20,"",8.0,3.0)
mytrees1.set_draw_details(flatsh, [tree2img], 0.0, 0.0)
mytrees1.set_fog(*TFOG)

mytrees2 = MergeShape(name="trees2")
Пример #8
0
ortho_cam = Camera(is_3d=False)  # 2d orthographic view camera

#setup textures, light position and initial model position
Light((0, 5, 0))
#create shaders
shader = Shader("shaders/uv_reflect")
flatsh = Shader("shaders/uv_flat")
defocus = Defocus()

#Create textures
shapeimg = Texture("textures/straw1.jpg")
shapebump = Texture("textures/floor_nm.jpg", True)
shapeshine = Texture("textures/pong3.png")

#Create shape
myshape = MergeShape(camera=persp_cam)  #specify perspective view
asphere = Sphere(sides=16, slices=16)
myshape.radialCopy(asphere, step=72)
myshape.position(0.0, 0.0, 5.0)
myshape.set_draw_details(shader, [shapeimg, shapebump, shapeshine], 8.0, 0.1)

mysprite = Sprite(w=10.0, h=10.0, camera=persp_cam)
mysprite.position(0.0, 0.0, 15.0)
mysprite.set_draw_details(flatsh, [shapebump])

tick = 0
next_time = time.time() + 2.0

#load ttf font and set the font colour to 'raspberry'
arialFont = Ttffont("fonts/FreeMonoBoldOblique.ttf", "#dd00aa")
mystring = String(font=arialFont,
Пример #9
0
matsh = Shader("shaders/mat_reflect")
flatsh = Shader("shaders/uv_flat")

#Create textures
shapeimg = Texture("textures/straw1.jpg")
shapebump = Texture("textures/mudnormal.jpg")
waterbump = []
iFiles = glob.glob("textures/water/n_norm???.png")
iFiles.sort()  # order is vital to animation!
for f in iFiles:
    waterbump.append(Texture(f))
num_n = len(waterbump)
shapeshine = Texture("textures/stars.jpg")

#Create shape
myshape = MergeShape()
num = (2, 2)
asphere = Sphere(sides=32)
for i in range(num[0]):
    for j in range(num[1]):
        myshape.add(asphere, -num[0] * 0.9 + 1.8 * i, -num[1] * 0.9 + 1.8 * j,
                    0.0)

myshape.position(0.0, 0.0, 5)
myshape.set_draw_details(shader, [shapeimg, shapebump, shapeshine], 1.0, 0.1)
myshape.set_material((1.0, 0.5, 0.2, 0.5))

mywater = Plane(w=130.0, h=130.0)
mywater.set_draw_details(matsh, [waterbump[0], shapeshine], 12.0, 0.6)
mywater.set_material((0.0, 0.05, 0.1))
mywater.set_fog((0.4, 0.6, 0.8, 0.0), 150)
Пример #10
0
# Create elevation map
mapwidth = 1000.0
mapdepth = 1000.0
mapheight = 100.0
mymap = ElevationMap("textures/maze1.jpg",
                     width=mapwidth, depth=mapdepth, height=mapheight,
                     divx=128, divy=128, name="sub")
mymap.set_draw_details(shader, [rockimg1, rockimg2, shineimg], 128.0, 0.05)

# Create fog for more realistic fade in distance. This can be turned on and off between drawing different object (i.e backgound not foggy)
mymap.set_fog((0.1,0.1,0.1,1.0), 200.0)

#Create tree models
treeplane = Plane(w=4.0, h=5.0)

treemodel1 = MergeShape(name="baretree")
treemodel1.add(treeplane.buf[0], 0,0,0)
treemodel1.add(treeplane.buf[0], 0,0,0, 0,90,0)

#Scatter them on map using Merge shape's cluster function
mytrees1 = MergeShape(name="trees1")
mytrees1.cluster(treemodel1.buf[0], mymap,0.0,0.0,900.0,900.0,10,"",8.0,3.0)
mytrees1.buf[0].set_draw_details(shader, [tree2img, rockimg2], 4.0, 0.0)
mytrees1.set_fog((0.1,0.1,0.1,1.0), 200.0)

raspberry = MergeShape(name="rasp")
raspberry.cluster(treemodel1.buf[0], mymap,-250,+250,470.0,470.0,5,"",8.0,1.0)
raspberry.buf[0].set_draw_details(shader, [raspimg, raspimg], 1.0, 0.0)
raspberry.set_fog((0.1,0.1,0.1,1.0), 200.0)

""" MergeShape can be used to join a number of Model object for much greater 
Пример #11
0
myecube = EnvironmentCube(900.0,"FACES")

# Create elevation map
mapwidth=1000.0
mapdepth=1000.0
mapheight=60.0
mountimg1 = texs.loadTexture("textures/mars_colour.png")
mymap = ElevationMap("textures/mars_height.png",mapwidth,mapdepth,mapheight,128,128) #testislands.jpg

#create robot
metalimg = texs.loadTexture("textures/metalhull.jpg")
robot_head= Sphere(2.0,12,12,0.5,"",0,3,0)
robot_body = Cylinder(2.0,4,12,"",0,1,0)
robot_leg = Cuboid(0.7,4.0,1.0,"",0,0.8,0)

robot = MergeShape()
robot.add(robot_head)
robot.add(robot_body)
robot.add(robot_leg, -2.1,0,0)
robot.add(robot_leg, 2.1,0,0)

#create space station
ssphere = Sphere(10,16,16)
scorrid = Cylinder(4,22,12)

station = MergeShape("",0,mymap.calcHeight(0,0),0, 0,0,0, 4,4,4)
station.add(ssphere, -20,0,-20)
station.add(ssphere, 20,0,-20)
station.add(ssphere, 20,0,20)
station.add(ssphere, -20,0,20)
station.add(scorrid, -20,0,0, 90,0,0)
Пример #12
0
mountimg1 = Texture("textures/mars_colour.png")
bumpimg = Texture("textures/mudnormal.jpg")
mymap = ElevationMap(mapfile="textures/mars_height.png",
                     width=mapwidth, depth=mapdepth, height=mapheight,
                     divx=128, divy=128)
mymap.set_draw_details(shader,[mountimg1, bumpimg],128.0, 0.0)
mymap.set_fog((0.3,0.15,0.1,0.1), 300.0)


#create robot
metalimg = Texture("textures/metalhull.jpg")
robot_head= Sphere(radius=1.0)
robot_body = Cylinder(radius=1.0, height=2.0, sides=12)
robot_leg = Cuboid(w=0.35, h=2.0)

robot = MergeShape()
robot.add(robot_head.buf[0], 0.0, 1.6)
robot.add(robot_body.buf[0], 0.0, 0.5)
robot.add(robot_leg.buf[0], -1.04, 0, 0)
robot.add(robot_leg.buf[0], 1.05, 0, 0)
robot.set_draw_details(shader, [metalimg, metalimg, reflcn], 0.0, 0.5)

#create space station
ssphere = Sphere(radius=10, slices=16, sides=16)
scorrid = Cylinder(radius=4, height=22)

station = MergeShape(y=mymap.calcHeight(0, 0), rx=4, ry=4, rz=4)
station.add(ssphere.buf[0], -20, 0, 20)
station.add(ssphere.buf[0], 20, 0, 20)
station.add(ssphere.buf[0], 20, 0, -20)
station.add(ssphere.buf[0], -20, 0, -20)
Пример #13
0
mymap = ElevationMap(mapfile="textures/mars_height.png",
                     width=mapwidth,
                     depth=mapdepth,
                     height=mapheight,
                     divx=128,
                     divy=128)
mymap.set_draw_details(shader, [mountimg1, bumpimg], 128.0, 0.0)
mymap.set_fog((0.3, 0.15, 0.1, 0.1), 300.0)

#create robot
metalimg = Texture("textures/metalhull.jpg")
robot_head = Sphere(radius=1.0)
robot_body = Cylinder(radius=1.0, height=2.0, sides=12)
robot_leg = Cuboid(w=0.35, h=2.0)

robot = MergeShape()
robot.add(robot_head.buf[0], 0.0, 1.6)
robot.add(robot_body.buf[0], 0.0, 0.5)
robot.add(robot_leg.buf[0], -1.04, 0, 0)
robot.add(robot_leg.buf[0], 1.05, 0, 0)
robot.set_draw_details(shader, [metalimg, metalimg, reflcn], 0.0, 0.5)

#create space station
ssphere = Sphere(radius=10, slices=16, sides=16)
scorrid = Cylinder(radius=4, height=22)

station = MergeShape(y=mymap.calcHeight(0, 0), rx=4, ry=4, rz=4)
station.add(ssphere.buf[0], -20, 0, 20)
station.add(ssphere.buf[0], 20, 0, 20)
station.add(ssphere.buf[0], 20, 0, -20)
station.add(ssphere.buf[0], -20, 0, -20)
Пример #14
0
myecube = EnvironmentCube(900.0,"CROSS")

# Create elevation map
mapwidth=1000.0
mapdepth=1000.0
mapheight=100.0
mymap = ElevationMap("textures/maze1.jpg",mapwidth,mapdepth,mapheight,128,128,1,"sub",0,0,0, smooth=True)
mymap2 = ElevationMap("textures/maze1.jpg",mapwidth,mapdepth,mapheight+0.1,128,128 ,64,"detail",0.0, 0.01, 0.0, smooth=True)

# Crete fog for more realistic fade in distance. This can be turned on and off between drawing different object (i.e backgound not foggy)
myfog = Fog(0.02, (0.1,0.1,0.1,1.0))

#Create tree models
treeplane = Plane(4.0,5.0)

treemodel1 = MergeShape("baretree")
treemodel1.add(treeplane, 0,0,0)
treemodel1.add(treeplane, 0,0,0, 0,90,0)

shed = Model("models/shed1.obj",texs,"shed",0,3,0, 0,0,0, 2,2,2)

#Scatter them on map using Merge shape's cluster function
mytrees1 = MergeShape("trees1")
mytrees1.cluster(treemodel1, mymap,0.0,0.0,900.0,900.0,10,"",8.0,3.0)
# (shape,elevmap,xpos,zpos,w,d,count,options,minscl,maxscl)
raspberry = MergeShape("rasp")
raspberry.cluster(treemodel1, mymap,-250,+250,470.0,470.0,5,"",8.0,1.0)

# createMergeShape can be used to join loadModel object for much greater rendering speed
# however, because these objects can contain multiple vGroups, each with their own texture image
# it is necessary to make a merge for each vGroup and, later, draw each merged object using each