Beispiel #1
0
    def render_scene(self,objects,lights,res):
        #create a viewport and image
        v = ViewPort(res[0],res[1])
        im = Image.new("RGB",(v.w,v.h))
        pix = im.load()

        #define a ray
        #FIX BUG -- STILL ORTHO
        ray = Ray(np.array([0,0,0]),np.array([0,0,-1]))

        # Perform perspective ray-tracing
        print("...generating "+str(v)+" image")
        for col in range(v.w):
            for row in range(v.h):
                color = np.zeros(3)
                print(color)
                ray.o = v.getPixelCenter(col,row)
                for s in objects:
                    t = s.intersectRay(ray)
                    if (t != None):
                        xp = ray.getPoint(t)
                        for light in lights:
                            color+= phongShader(xp,s.getNormal(xp),s.material,light,self.eye)
                            print(color)
                        #pix[col,v.h-1-row] = color
                        pix[col,v.h-1-row]=(1,1,1)   
        # Show the image in a window
        im.show()
Beispiel #2
0
    def render_scene(self, objects, lights, res):
        #create a viewport and image
        v = ViewPort(res[0], res[1])
        im = Image.new("RGB", (v.w, v.h))
        pix = im.load()

        #define a ray
        #FIX BUG -- STILL ORTHO
        ray = Ray(np.array([0, 0, 0]), np.array([0, 0, -1]))

        # Perform perspective ray-tracing
        print("...generating " + str(v) + " image")
        for col in range(v.w):
            for row in range(v.h):
                color = np.zeros(3)
                print(color)
                ray.o = v.getPixelCenter(col, row)
                for s in objects:
                    t = s.intersectRay(ray)
                    if (t != None):
                        xp = ray.getPoint(t)
                        for light in lights:
                            color += phongShader(xp, s.getNormal(xp),
                                                 s.material, light, self.eye)
                            print(color)
                        #pix[col,v.h-1-row] = color
                        pix[col, v.h - 1 - row] = (1, 1, 1)
        # Show the image in a window
        im.show()
	def mouse_button_event(self, event):
		print("Mouse button", event)
		if event.button == MouseButton.RIGHT:
			if event.action == "release":
				self._movement = None
				self._mousepos = None
			else:
				self._movement = "camera_yx"
				self._mousepos = event
		elif event.button == MouseButton.MIDDLE:
			if event.action == "release":
				self._movement = None
				self._mousepos = None
			else:
				action = self._MIDDLE_MOUSE_ACTIONS[self._middle_mouse_actionidx]
				self._movement = action
				self._mousepos = event
		elif event.button == MouseButton.LEFT:
			if event.action == "press":
				piece = self._getpieceat(event.world)
				if piece is not None:
					self._game.clickpiece(piece)
					self._display.mark_dirty()
		elif event.button == MouseButton.WHEEL_DOWN:
			# Zoom out
			self._display.viewport = ViewPort(anglex = self._display.viewport.anglex, angley = self._display.viewport.angley, distance = self._display.viewport.distance + self._ZOOM_DISTANCE)
		elif event.button == MouseButton.WHEEL_UP:
			# Zoom in
			self._display.viewport = ViewPort(anglex = self._display.viewport.anglex, angley = self._display.viewport.angley, distance = self._display.viewport.distance - self._ZOOM_DISTANCE)
Beispiel #4
0
 def __init__(self, root, stockReader):
     '''
     Constructor
     '''
     self.canvas = Canvas(root)
     self.canvas.pack(side="top", fill="both", expand=True)
     self.init()
     #The size of the canvas is (vr - vl) = 500 x (vb - vt) = 500
     vl = 100
     vr = 600
     vt = 80
     vb = 580
     
     period = stockReader.getLDate() - stockReader.getEDate()
     #the x-coordinates of the world view is the number of days between the latest date and earliest date
     wl = 0
     wr = period.days
     #the y-coordinates of the world view is the range between the largest high and smallest low from stockReader
     wt = stockReader.getLHigh()
     wb = stockReader.getSLow()
     
     self.viewPort = ViewPort(wl, wr, wt, wb,
                              vl, vr, vt, vb)
     
     self.initDraw(vl, vr, vt, vb, stockReader)
     
     self.drawGraph(stockReader)
     self.canvas.pack(fill=BOTH, expand=1)
Beispiel #5
0
    def set_child (self, child=None):
        """B.set_child (...) -> None

        Sets the child to display in the ScrolledList.

        Creates a parent-child relationship from the ScrolledList to a
        widget. If the widget does not support native scrolling, it will
        be packed into a ViewPort.
        """
        self.lock ()
        if child and not isinstance (child, ViewPort):
            self.vscrollbar.value = 0
            self.hscrollbar.value = 0
            child = ViewPort (child)
            child.minsize = self.minsize
        Bin.set_child (self, child)
        self.unlock ()
Beispiel #6
0
    def render_scene(objects,res):
        #create a viewport and image
        v = ViewPort(res[0],res[1])
        im = Image.new("RGB",(v.w,v.h))
        pix = im.load()

        #define a ray
        ray = Ray(np.array([0,0,0]),np.array([0,0,-1]))

        # Perform perspective ray-tracing

        for col in range(v.w):
            for row in range(v.h):
                ray.o = v.getPixelCenter(col,row)
                t = s.intersectRay(ray)
                if (t != None):
                    xp = ray.getPoint(t) 
                    pix[col,(v.h-1)-row] = phongShader(xp,s.getNormal(xp),s.material,light,eye)

        # Show the image in a window
        im.show()
        
Beispiel #7
0
    def render_scene(objects, res):
        #create a viewport and image
        v = ViewPort(res[0], res[1])
        im = Image.new("RGB", (v.w, v.h))
        pix = im.load()

        #define a ray
        ray = Ray(np.array([0, 0, 0]), np.array([0, 0, -1]))

        # Perform perspective ray-tracing

        for col in range(v.w):
            for row in range(v.h):
                ray.o = v.getPixelCenter(col, row)
                t = s.intersectRay(ray)
                if (t != None):
                    xp = ray.getPoint(t)
                    pix[col,
                        (v.h - 1) - row] = phongShader(xp, s.getNormal(xp),
                                                       s.material, light, eye)

        # Show the image in a window
        im.show()
    def __init__(self):
        # GameObjects
        self.sprites = None  # A Pygame Group of all the sprites to draw
        self.moving_sprites = None  # A Pygame Group of all the movable sprites
        self.bullet_sprites = None
        self.platforms = None  # A Pygame Group of platforms
        self.player = None  #The Player

        # Physics
        self.gravity = 0.21875


        # Viewport
        self.viewport = ViewPort(350, 450, 100, 450)
        self.limit = 15000
	def mouse_drag_event(self, event):
		print("Mouse drag", event)
		if self._movement is not None:
			if self._mousepos is not None:
				movementu = (event.x - self._mousepos.x) * self._MOUSESPEED
				movementv = (event.y - self._mousepos.y) * self._MOUSESPEED
				if self._movement == "camera_yx":
					self._display.viewport = ViewPort(anglex = self._display.viewport.anglex + movementv, angley = self._display.viewport.angley + movementu, distance = self._display.viewport.distance)
				elif self._movement == "lightpos_xz":
					self._display.set_uniform("lightPos_WorldSpace", self._display.get_uniform("lightPos_WorldSpace").affect("xz", movementu * 0.25, movementv * 0.25))
				elif self._movement == "lightpos_y":
					self._display.set_uniform("lightPos_WorldSpace", self._display.get_uniform("lightPos_WorldSpace").affect("y", movementv * 0.25))
				elif self._movement == "lightpower":
					self._display.set_uniform("SpecularExp", self._display.get_uniform("SpecularExp") + movementu * 0.25)
					self._display.set_uniform("LightPower", self._display.get_uniform("LightPower") * (1 - (movementv * 0.01)))
					print("Power %4.0f Specular %5.3f" % (self._display.get_uniform("LightPower"), self._display.get_uniform("SpecularExp")))
				else:
					print("Unknown movement direction", self._movement)
				self._display.mark_dirty()
				self._mousepos = event
class Level(State):
    def __init__(self):
        # GameObjects
        self.sprites = None  # A Pygame Group of all the sprites to draw
        self.moving_sprites = None  # A Pygame Group of all the movable sprites
        self.bullet_sprites = None
        self.platforms = None  # A Pygame Group of platforms
        self.player = None  #The Player

        # Physics
        self.gravity = 0.21875


        # Viewport
        self.viewport = ViewPort(350, 450, 100, 450)
        self.limit = 15000


    def init(self, engine):

        engine.log("Init Level 2")
        self.player = Mercenario()
        self.sprites = pygame.sprite.Group()
        self.platforms = pygame.sprite.Group()
        self.moving_sprites = pygame.sprite.Group()
        self.bullet_sprites = pygame.sprite.Group()

        self.moving_sprites.add(self.player)

       # WALL AND PLATFORM PLACEMENTS
        wall = Platform(0, 550, self.limit, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        wall = Platform(0, 250, 150, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        wall = Platform(500, 450, 150, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        wall = Platform(252, 176, 490-252, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        wall = Platform(38, 430, 290-38, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        wall = Platform(578, 320, 994-578, 50)
        self.platforms.add(wall)
        self.sprites.add(wall)

        self.sprites.add(self.player)



    def handleEvents(self, engine, events):
        for event in events:
            if event.type == pygame.QUIT:
                engine.exit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    mousex, mousey = pygame.mouse.get_pos()
                    angle = getAngle(self.player.rect.x, self.player.rect.y, mousex, mousey)
                    p = self.player.shoot(angle)
                    if p:
                        self.bullet_sprites.add(p)
                        self.sprites.add(p)

            self.player.control(event)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    engine.addState(PauseGameState(self.sprites))

                if event.key == pygame.K_r:
                    engine.changeState(Level())



    def update(self, engine):

        self.player.update(self.platforms)

        # Gravity
        self.applyGravity(self.player)


        # Bullets
        for s in self.bullet_sprites:
            s.update(self.moving_sprites)

        #SHIFTING THE WORLD
        self.viewport.update(self, self.player)

    def shiftWorld(self, shift_x, shift_y):

        for platform in self.platforms:
            platform.rect.x += shift_x
            platform.rect.y += shift_y

        for s in self.bullet_sprites:
            s.rect.x += shift_x
            s.rect.y += shift_y

    def applyGravity(self, sprite):
        """ Calculate effect of gravity and applies it to the sprite. """
        if not sprite.isGrounded:
            sprite.velocity_y *= 0.99
            sprite.velocity_y += self.gravity  # Progressive incrmenting of the velocity (acceleration)
            sprite.isGrounded = False

    def draw(self, engine):
        engine.screen.fill(Colors.BLUE)
        self.sprites.draw(engine.screen)
Beispiel #11
0
class ChartingCanvas():
    '''
    paints the x-y plot (graph) based on the data
    '''


    def __init__(self, root, stockReader):
        '''
        Constructor
        '''
        self.canvas = Canvas(root)
        self.canvas.pack(side="top", fill="both", expand=True)
        self.init()
        #The size of the canvas is (vr - vl) = 500 x (vb - vt) = 500
        vl = 100
        vr = 600
        vt = 80
        vb = 580
        
        period = stockReader.getLDate() - stockReader.getEDate()
        #the x-coordinates of the world view is the number of days between the latest date and earliest date
        wl = 0
        wr = period.days
        #the y-coordinates of the world view is the range between the largest high and smallest low from stockReader
        wt = stockReader.getLHigh()
        wb = stockReader.getSLow()
        
        self.viewPort = ViewPort(wl, wr, wt, wb,
                                 vl, vr, vt, vb)
        
        self.initDraw(vl, vr, vt, vb, stockReader)
        
        self.drawGraph(stockReader)
        self.canvas.pack(fill=BOTH, expand=1)
        
        
        
        
        
    def initDraw(self, vl, vr, vt, vb, stockReader):
        period = stockReader.getLDate() - stockReader.getEDate()
        priceRange = stockReader.getLHigh() - stockReader.getSLow()
        #draw grid lines. 11 for each sides. Also set dates and prices for the grid
        for i in range(11):
            #Get the whole range for date and price
            dateText = (stockReader.getEDate() + i * period / 10).date()
            priceText = (stockReader.getLHigh() - i * priceRange / 10)
            #reformat to 2 decimal points
            p = float("{0:.2f}".format(priceText))
            #Drawing vertical grid and set text for each grid
            x = vl + i * self.verGrid
            self.drawVerticalLine(x, vt-10, (vb-vt)+20)
            self.canvas.create_text(x, vb+10, text = str(dateText), font=("Arial", 5))
            #Drawing horizontal grid and set text for each grid
            y = vt + i * self.horGrid
            self.drawHorizontalLine(vl-10, y, (vr - vl)+20)
            self.canvas.create_text(vl-25, y, text = str(p), font=("Arial", 5))
        #set the chart name
        self.canvas.create_text(700/2, 700 / 15, text = (str(stockReader.symbol) + " Stock Prices"), font=("Arial", 20))
        #set title for horizontal
        self.canvas.create_text(700/2, 700 - 50, text = "Dates", font=("Arial", 9))
        
            
    #Plot the graph based on the data from stock reader
    def drawGraph(self, stockReader):
        for stock in stockReader.stock_list:
            wx = (stock.date - stockReader.getEDate()).days
            wy = stock.op
            #Get vx, vy from wx, wy based on viewPort
            vx, vy = self.viewPort.toPixels(wx, wy)
            #Draw the point on the graph
            x1, y1 = ( vx - 1 ), ( vy - 1 )
            x2, y2 = ( vx + 1 ), ( vy + 1 )
            self.canvas.create_oval( x1, y1, x2, y2, fill = "#A8FDA0" )

        
    def init(self):
        self.verGrid = 50
        self.horGrid = 50
        self.chartTitle = "Stock Graph"
        self.horTitle = ""
        self.verTitle = ""
    
    #Getters and setters
    def getVerGrid(self):
        return self.verGrid
    
    def setVerGrid(self, verGrid):
        self.verGrid = verGrid
    
    def getHorGrid(self):
        return self.horGrid
    
    def setHorGrid(self,horGrid):
        self.horGrid = horGrid
        
    def getVerTitle(self):
        return self.verTitle
    
    def setVerTitle(self, verTitle):
        self.verTitle = verTitle
        
    def getHorTitle(self):
        return self.horTitle
    
    def setHorTitle(self, horTitle):
        self.horTitle = horTitle
        
    def getChartTitle(self):
        return self.chartTitle
    
    def setChartTitle(self, chartTitle):
        self.chartTitle = chartTitle
        
    def getData(self):
        return self.data
    
    def setData(self, data):
        self.data = data
    
    def drawVerticalLine(self,x1,y1,length):
        self.canvas.create_line(x1,y1,x1,y1+length)
    
    def drawHorizontalLine(self,x1,y1,length):
        self.canvas.create_line(x1,y1,x1+length,y1) 
Beispiel #12
0
 def reset_viewport(self):
     self.viewport = ViewPort(anglex=65, angley=0, distance=18)
Beispiel #13
0
def run():
    timeStart = time.time()
    perspective = True
    jittering = False
    numJitters = 8
    jitterArray = Halton.halton_sequence(numJitters, 2)

    o = AccelStruct()
    lights = []

    # OBJ file
    # m = Parser.parse("meshes/dragon.obj", transform=np.dot(Helper.scaleMatrix(0.7, 0.7, 0.7),
    #                                                        Helper.translationMatrix(1.25, 1.25, 1.75)))
    # print(m.min)
    # print(m.max)
    # o.add(m)

    # Cornell Box
    # o.add(RectFace([0, 0, 0], [550, 0, 0], [0, 0, 550], mat=[250, 250, 250]))  # floor
    # o.add(RectFace([0, 550, 0], [0, 550, 550], [550, 550, 0], mat=[250, 250, 250]))  # ceiling
    # o.add(RectFace([0, 0, 550], [550, 0, 550], [0, 550, 550], mat=[250, 250, 250]))  # back wall
    # o.add(RectFace([0, 0, 0], [0, 0, 550], [0, 550, 0], mat=[0, 250, 0]))  # right wall
    # o.add(RectFace([550, 0, 0], [550, 550, 0], [550, 0, 550], mat=[250, 0, 0]))  # left wall
    # o.add(Box([130, 0, 65], [160, 0, 49], [-49, 0, 160], [0, 165, 0], mat=[255, 255, 255]))  # short box
    # o.add(Box([265, 0, 296], [158, 0, -49], [49, 0, 158], [0, 330, 0], mat=[255, 255, 255]))  # tall box
    # # lights.append(AreaLight([213, 549, 227], [343, 549, 227], [213, 549, 332], o))
    # lights.append(PointLight([300, 540, 200]))
    # viewPt = np.array([278.0, 273.0, -800.0])
    # viewDir = Helper.normalize(np.array([0.0, 0.0, 1.0]))
    # viewUp = Helper.normalize(np.array([0.0, 1.0, 0.0]))
    # viewPortDist = 1.0
    # viewZoom = 1.5

    # Blobby
    # BlobbyParticles(o, [255, 0, 0], 0.1, *particles)
    # for p in particles:
    #     o.add(Sphere(2.0, p, mat=[255, 0, 0]))

    # Textures
    # o.add(Plane([0, 0, 0], [0, 1, 0], mat=[250, 250, 250], minimum=[-10, -10, -10], maximum=[10, 10, 10], matfunc=grid))
    # o.add(
    #     Plane([0, 0, -3], [0, 0, 1], mat=[250, 250, 250], minimum=[-10, -10, -10], maximum=[10, 10, 10], matfunc=grid))
    o.add(Sphere(2.0, [-3, 1, -1], mat=[50, 130, 250], matfunc=marbleTexture))

    # CSG
    c = CSG(Sphere(3.0, [0, 3, 0], mat=[250, 0, 0], matfunc=grid))
    c.add(Sphere(3.0, [1, 3, 0]), 1)
    # c.add(Sphere(3.0, [0.5, 0, 0]), 1)
    o.add(c)

    lights.append(PointLight([0, 10, 2]))
    viewPt = [0, 2, 6]
    viewDir = [0, 0, -1]
    viewUp = [0, 1, 0]
    viewPortDist = 1.0
    viewZoom = 0.5

    # create a viewport and image
    v = ViewPort(resolution, resolution, viewPt, viewDir, viewUp, viewPortDist,
                 viewZoom)
    a = np.zeros((v.h, v.w, 3))
    o.calculate()
    print("Total time to setup objects: {:.3}s".format(time.time() -
                                                       timeStart))
    timeStart = time.time()
    with concurrent.futures.ThreadPoolExecutor() as e:
        futures = []
        for row in tqdm(range(v.h)):
            for col in range(v.w):
                if jittering:
                    for n in range(numJitters):
                        ray = Ray(
                            v.getPixelCenterJittered(col, row, jitterArray, n),
                            viewDir)
                        if perspective:
                            ray.d = Helper.normalize(ray.o - viewPt)

                        futures.append(
                            e.submit(Helper.rayTrace, ray, o, lights, row, col,
                                     0))
                else:
                    ray = Ray(v.getPixelCenter(col, row), viewDir)
                    if perspective:
                        ray.d = Helper.normalize(ray.o - viewPt)

                    futures.append(
                        e.submit(Helper.rayTrace, ray, o, lights, row, col, 0))
        with tqdm(total=v.h * v.w * numJitters if jittering else v.h *
                  v.w) as pbar:
            for future in concurrent.futures.as_completed(futures):
                (row, col, color) = future.result()
                pbar.update()
                if color is not None:
                    if jittering:
                        a[row, col] += color / numJitters
                    else:
                        a[row, col] = color

    timeEnd = time.time()
    time.sleep(0.1)
    print("Total time to compute ray trace on {:} pixels: {:.4}s".format(
        v.w * v.h, timeEnd - timeStart))
    print("Average time to compute each pixel: {:.3}ms".format(
        1000.0 * (timeEnd - timeStart) / (v.w * v.h)))
    # a *= 255.0/a.max()
    im = Image.new("RGB", (v.w, v.h))
    pix = im.load()
    for row in range(v.h):
        for col in range(v.w):
            pix[row, (v.w - 1) - col] = tuple(a[row, col].astype(int))
    im.save('out.bmp')
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS WITH THE SOFTWARE.
""" 

import numpy as np
import matplotlib.pyplot as pt
import random

from PIL import Image
from Sphere import Sphere
from Ray import Ray
from ViewPort import ViewPort

#create a viewport and image
v = ViewPort(500,500)
im = Image.new("RGB",(v.w,v.h))
pix = im.load()

#define a sphere
radius = 1.0
center = np.array([0,0, -2.5])
s = Sphere(radius,center,np.array([255,0,0]))

#define a ray
ray = Ray(np.array([0,0,0]),np.array([0,0,-1]))

# define a light direction
ldir = np.array([0,0,1]) #light direction
kd = 0.75  #reflectivity 
illum = 1.0  #light luminosity
Beispiel #15
0
 def __init__(self, scrolledlist):
     self._scrolledlist = scrolledlist
     self._images = {}
     self._realwidth = 0
     self._realheight = 0
     ViewPort.__init__(self, None)
 def __init__ (self, scrolledlist):
     self._scrolledlist = scrolledlist
     self._images = {}
     self._realwidth = 0
     self._realheight = 0
     ViewPort.__init__ (self, None)
Beispiel #17
0
from Ray import Ray
from ViewPort import ViewPort
from Reflect import Reflect
from Plane import Plane
from Triangle import Triangle
from operator import itemgetter
from PhongShading import PhongShading
from math import *
from ObjReader import objRead
from Octree import Onode, Octree
from SoftShading import SoftShading
from Trans import Transparency
from glossy import Glossy

#create a viewport and image
v = ViewPort(np.array([0.0, 0.0, 0.0]), np.array([0.0, 0.0, -10.0]),
             np.array([0.0, 1.0, 0.0]), 5.0, 10.0, 500)
im = Image.new("RGB", (v.w, v.h))
pix = im.load()

tree = Octree()

#define a point light
light = SoftShading(np.array([-1.0, 10.0, 0.0]), np.array([1.0, 10.0, 0.0]),
                    np.array([-1.0, 12.0, 0.0]), np.array([1.0, 12.0, 0.0]),
                    np.array([1.0, 1.0, 1.0]), 0.8)

#define a sphere
radius = 1.0
#materialS = np.array([1.0,0.0,0.0])
#for j in range(-5, 5, 5):
#    for i in range(-5, 5, 5):
Beispiel #18
0
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS WITH THE SOFTWARE.
"""

import numpy as np
import matplotlib.pyplot as pt
import random

from PIL import Image
from Sphere import Sphere
from Ray import Ray
from ViewPort import ViewPort

#create a viewport and image
v = ViewPort(500, 500)
im = Image.new("RGB", (v.w, v.h))
pix = im.load()

#define a sphere
radius = 1.0
center = np.array([0, 0, -2.5])
s = Sphere(radius, center, np.array([255, 0, 0]))

#define a ray
ray = Ray(np.array([0, 0, 0]), np.array([0, 0, -1]))

# define a light direction
ldir = np.array([0, 0, 1])  #light direction
kd = 0.75  #reflectivity
illum = 1.0  #light luminosity