summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgroup1 <f16_group1@pbridge.adm.cs.cmu.edu>2016-10-16 22:12:51 -0400
committergroup1 <f16_group1@pbridge.adm.cs.cmu.edu>2016-10-16 22:12:51 -0400
commit22f814539e14312afb5627f7ad39905e9450209b (patch)
treeee0751e887600ed2a56bfc07a8bc34c537efcfda
parentcc3d2cd333f6c0c18a201d4ede36b1c62e9caef8 (diff)
parent0f54d73feea16124e92ff6baab78e3d3d3d97fa3 (diff)
downloadbridge-22f814539e14312afb5627f7ad39905e9450209b.tar.zst
Merge branch 'master' of https://github.com/rayhogenson/bridge
Conflicts: fish_show.py
-rw-r--r--color.py6
-rwxr-xr-xevents-example3.py4
-rw-r--r--fish_show.py89
-rw-r--r--fish_types.py266
-rw-r--r--webapp/app/static/carousel.css10
-rw-r--r--webapp/app/templates/index.html24
6 files changed, 312 insertions, 87 deletions
diff --git a/color.py b/color.py
index c65252b..8f7f72c 100644
--- a/color.py
+++ b/color.py
@@ -50,6 +50,12 @@ class Vector(object):
new_y = self.x * sintheta + self.y * costheta
return self.__class__(new_x, new_y)
+ def __unicode__(self):
+ return '<{}, {}, {}>'.format(self.x, self.y, self.z)
+
+ def __str__(self):
+ return unicode(self)
+
@property
def components(self):
diff --git a/events-example3.py b/events-example3.py
index bbf2d68..18db630 100755
--- a/events-example3.py
+++ b/events-example3.py
@@ -114,7 +114,11 @@ def fixDirection(data, theta=None):
def doStep(data):
data.counter += 1
+<<<<<<< HEAD
+ if random.random() < 1 / 50:
+=======
if data.counter % 50 == 0:
+>>>>>>> 9b60deedc508c74b249fd1da0776b5a719322807
fixDirection(data)
#print(abs(data.tailAcceleration))
data.speed += data.drag * data.speed / abs(data.speed)
diff --git a/fish_show.py b/fish_show.py
index 84b0516..e410895 100644
--- a/fish_show.py
+++ b/fish_show.py
@@ -6,85 +6,7 @@ import constants
from constants import *
import math
from show import Show
-
-
-
-class Fish(object):
- """Object displayed on the bridge, probably a fish."""
- def __init__(self, x, y, width, height, color, step):
- """Create fish with default parameters."""
- self.x = x
- self.y = y
- self.width = width
- self.height = height
- self.color = color
- self.speed = step
- self.step = step
-
- self.speed = Vector(0.1, 0)
- self.drag = -0.09
-
- self.tailAccelMag = 0.4
- self.tailAcceleration = Vector(self.tailAccelMag, 0)
- self.tailDuration = 2
- self.tailMoving = False
- self.tailThreshold = 0.7
- self.tailMoveCount = 0
-
- def update(self):
- """Swim gently to the other side of the bridge."""
- if self.x > constants.BRIDGE_WIDTH or self.x < -self.width:
- return False
-
- self.speed += self.drag * self.speed
- if abs(self.speed) < self.tailThreshold:
- self.tailMoving = True
- self.tailThreshold = rand_in_range(0.5, 1.4)
- self.fix_direction()
- if self.tailMoveCount > self.tailDuration:
- self.tailMoveCount = 0
- self.tailMoving = False
- if self.tailMoving:
- self.speed += self.tailAcceleration
- self.tailMoveCount += 1
- self.x += self.speed.components[0]
- self.y += self.speed.components[1]
-
- return True
-
- def fix_direction(self):
- min_theta = -0.32
- max_theta = 0.32
- if self.y < 0:
- min_theta = 0
- if self.y > 1:
- max_theta = 0
-
- #theta = rand_in_range(min_theta, max_theta)
- theta = random.gauss((max_theta+min_theta)/2, (max_theta - min_theta)/12)
- self.tailAcceleration = Vector(self.tailAccelMag, 0).rot2d(theta)
-
- @classmethod
- def by_type(cls, fish_type):
- if (fish_type == 'jellyfish'):
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'dolphin':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'boat':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'dory':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'nemo':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'whale':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'stingray':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'eel':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
- if fish_type == 'shark':
- return cls(0, 0.5, 23, 1.5, color.black, 1)
-
+from fish_types import Fish
class Light(object):
@@ -114,7 +36,8 @@ class Light(object):
for fish in fishes:
coverage = compute_coverage(fish, self.x, self.y)
if coverage > 0.01:
- new_color = coverage * fish.color + (1 - coverage) * new_color
+ fish_color = fish.color_at(self.x, self.y)
+ new_color = coverage * fish_color + (1 - coverage) * new_color
self.light.setRGBRaw(
*map(lambda x: clamp(0, x, 1), new_color.components)
)
@@ -130,7 +53,7 @@ def compute_coverage(fish, x, y):
min_y = min(max(y, fish.y), y + 1)
max_y = max(min(y+1, fish.y + fish.height), y)
coverage = (max_x - min_x) * (max_y - min_y)
- return coverage * scale
+ return coverage * scale * fish.alpha_at(x, y)
def pick_HSV(depth):
@@ -196,7 +119,3 @@ class FishShow(Show):
if self.depth > self.MAX_DEPTH:
self.stop()
-
-
-def rand_in_range(low, high):
- return random.random() * (high - low) + low
diff --git a/fish_types.py b/fish_types.py
new file mode 100644
index 0000000..61cd36a
--- /dev/null
+++ b/fish_types.py
@@ -0,0 +1,266 @@
+from __future__ import division
+import color as C
+import functools
+import constants
+import random
+import math
+
+class Fish(object):
+ """Object displayed on the bridge, probably a fish.
+
+ Must override color (or color_at), drag, width, height, tailThreshold,
+ tailDuration, tailAccelMag
+ """
+ def __init__(self, x=None, y=None):
+ """Create fish with default parameters."""
+ if x is not None:
+ self.x = x
+ elif not hasattr(self, 'x'):
+ self.x = 0
+ if x is not None:
+ self.y = y
+ elif not hasattr(self, 'y'):
+ self.y = 0.5
+ self.speed = C.Vector(0, 0)
+ self.tailAcceleration = C.Vector(self.tailAccelMag, 0)
+ self.tailMoving = False
+ self.tailMoveCount = 0
+ if not hasattr(self, 'theta_scale'):
+ self.theta_scale = 12
+
+ @staticmethod
+ def by_type(fish_type):
+ if (fish_type == 'jellyfish'):
+ return Jellyfish()
+ if fish_type == 'dolphin':
+ return Dolphin()
+ if fish_type == 'boat':
+ return Boat()
+ if fish_type == 'dory':
+ return Dory()
+ if fish_type == 'nemo':
+ return Nemo()
+ if fish_type == 'whale':
+ return Whale()
+ if fish_type == 'stingray':
+ return Stingray()
+ if fish_type == 'eel':
+ return Eel()
+ if fish_type == 'shark':
+ return Shark()
+
+ def update(self):
+ """Swim gently to the other side of the bridge."""
+ if self.x > constants.BRIDGE_WIDTH or self.x < -self.width:
+ return False
+
+ self.speed += self.drag * self.speed
+ if abs(self.speed) < self.tailThreshold:
+ self.tailMoving = True
+ self.tailThreshold = rand_in_range(0.5, 1.4)
+ self.fix_direction()
+ if self.tailMoveCount > self.tailDuration:
+ self.tailMoveCount = 0
+ self.tailMoving = False
+ if self.tailMoving:
+ self.speed += self.tailAcceleration
+ self.tailMoveCount += 1
+ self.x += self.speed.components[0]
+ self.y += self.speed.components[1]
+
+ return True
+
+ def fix_direction(self):
+ min_theta = -0.32
+ max_theta = 0.32
+ if self.y + self.height < 0:
+ min_theta = 0
+ if self.y > 2:
+ max_theta = 0
+
+ #theta = rand_in_range(min_theta, max_theta)
+ theta = random.gauss(
+ (max_theta+min_theta)/2, (max_theta - min_theta)/self.theta_scale
+ )
+ self.tailAcceleration = C.Vector(self.tailAccelMag, 0).rot2d(theta)
+
+ def color_at(self, x, y):
+ """May be overridden to provide multicolored fish."""
+ return self.color
+
+ def alpha_at(self, x, y):
+ """Return an additional scale amount for clear parts.
+
+ This is overridden to have oddly shaped fish, such as the eel."""
+ return 1
+
+
+class Jellyfish(Fish):
+ color = C.HSV(298/360, 89/100, 53/100).to_RGB()
+ drag = -0.01
+ width = 15
+ height = 1.5
+ tailThreshold = 0.001
+ tailDuration = 4
+ tailAccelMag = 0.001
+
+
+class Dolphin(Fish):
+ color = C.HSV(18/360, 0/100, 40/100).to_RGB()
+ drag = -0.09
+ width = 35
+ height = 1.5
+ tailThreshold = 0.7
+ tailDuration = 2
+ tailAccelMag = 0.8
+ gravity = C.Vector(0, -0.01)
+
+ direction_fixed = False
+ def update(self):
+ """Swim gently to the other side of the bridge."""
+ if self.x > constants.BRIDGE_WIDTH or self.x < -self.width:
+ return False
+
+ if not self.direction_fixed:
+ self.tailAcceleration = self.tailAcceleration.rot2d(math.pi / 32)
+ self.direction_fixed = True
+
+ self.speed += self.drag * self.speed + self.gravity
+ if self.y <= 0.25:
+ self.tailMoving = True
+ if self.tailMoveCount > self.tailDuration:
+ self.tailMoveCount = 0
+ self.tailMoving = False
+ if self.tailMoving:
+ self.speed += self.tailAcceleration
+ self.tailMoveCount += 1
+ self.x += self.speed.components[0]
+ self.y += self.speed.components[1]
+
+ return True
+
+
+class Boat(Fish):
+ color = C.HSV(24/360, 45/100, 44/100).to_RGB()
+ drag = 0
+ width = 23
+ height = 1
+ tailDuration = 1
+ tailAccelMag = 0.25
+ tailThreshold = tailAccelMag
+ y = 1
+
+ def fix_direction(self):
+ pass
+
+
+class Dory(Fish):
+ # Need to try this on the bridge
+ color = C.HSV(235/360, 100/100, 88/100).to_RGB()
+ drag = -0.1
+ width = 23
+ height = 1.5
+ tailThreshold = 0.7
+ tailDuration = 2
+ tailAccelMag = 0.4
+
+
+class Nemo(Fish):
+ color = C.HSV(31/360, 100/100, 50/100).to_RGB()
+ drag = -0.09
+ width = 23
+ height = 1.5
+ tailThreshold = 0.7
+ tailDuration = 2
+ tailAccelMag = 0.4
+
+
+class Whale(Fish):
+ drag = -0.2
+ width = 50
+ height = 2
+ tailThreshold = 0.7
+ tailDuration = 3
+ tailAccelMag = 0.4
+ theta_scale = 20
+
+ y = 0
+
+ white_x_min = 30
+ white_x_width = 8
+ white_y_min = 1
+ white_y_height = 1
+
+ def color_at(self, x, y):
+ """Mostly copied from compute_coverage.
+
+ The point here is to render that white part of the Orca.
+ """
+ white_x_min = self.white_x_min + self.x
+ white_x_max = white_x_min + self.white_x_width
+ white_y_min = self.white_y_min + self.y
+ white_y_max = white_y_min + self.white_y_height
+ min_x = min(max(x, white_x_min), x + 1)
+ max_x = max(min(x + 1, white_x_max), x)
+ min_y = min(max(y, white_y_min), y + 1)
+ max_y = max(min(y + 1, white_y_max), y)
+ coverage = (max_x - min_x) * (max_y - min_y)
+ return C.white * coverage
+
+
+class Stingray(Fish):
+ color = C.HSV(0/360, 0/100, 50/100).to_RGB()
+ drag = -0.09
+ width = 15
+ height = 2
+ tailThreshold = 0.7
+ tailDuration = 2
+ tailAccelMag = 0.2
+
+
+class Eel(Fish):
+ color = C.HSV(109/360, 83/100, 35/100).to_RGB()
+ drag = -0.09
+ width = 50
+ height = 2
+ tailThreshold = 0.7
+ tailDuration = 2
+ tailAccelMag = 0.1
+
+ front_offset = 0
+ y = 0
+
+ def alpha_at(self, x, y):
+ rel_x = x - self.x
+ rel_y = y - self.y
+ eel_height = math.sin(
+ 2 * math.pi * (rel_x + self.front_offset) / self.width
+ ) / 2 + 0.5
+ y_blend = abs(rel_y - eel_height)
+ if y_blend > 0.5:
+ return 0
+ return (1 - y_blend)
+
+ def update(self):
+ self.front_offset += abs(self.speed)
+ if self.front_offset > self.width:
+ self.front_offset = 0
+ return super(Eel, self).update()
+
+ def fix_direction(self):
+ pass
+
+
+class Shark(Fish):
+ color = C.HSV(0/360, 0/100, 50/100).to_RGB()
+ drag = -0.2
+ width = 50
+ height = 2
+ tailThreshold = 0.7
+ tailDuration = 3
+ tailAccelMag = 0.4
+ theta_scale = 20
+
+
+def rand_in_range(low, high):
+ return random.random() * (high - low) + low
diff --git a/webapp/app/static/carousel.css b/webapp/app/static/carousel.css
index 9ef5474..4e49305 100644
--- a/webapp/app/static/carousel.css
+++ b/webapp/app/static/carousel.css
@@ -93,6 +93,14 @@ body {
letter-spacing: -1px;
}
+img.img-disable {
+ -webkit-filter: grayscale(100%);
+ -moz-filter: grayscale(100%);
+ -o-filter: grayscale(100%);
+ -ms-filter: grayscale(100%);
+ filter: grayscale(100%);
+ opacity: 0.5;
+}
/* RESPONSIVE CSS
-------------------------------------------------- */
@@ -133,6 +141,4 @@ body {
margin-top: 120px;
}
-
-
}
diff --git a/webapp/app/templates/index.html b/webapp/app/templates/index.html
index 3592985..4dadb7b 100644
--- a/webapp/app/templates/index.html
+++ b/webapp/app/templates/index.html
@@ -124,6 +124,23 @@
var c = new creature(msg.name, socket);
c.render($('#creatures'));
});
+
+ socket.on('enable image', function(msg) {
+ console.log('enable image');
+ // to be tested
+ var name = msg.name;
+ var myImgElement = $("#" + name);
+ myImgElement.removeClass('img-disable');
+
+ });
+
+ socket.on('disable image', function(msg) {
+ console.log('disable image');
+ // to be tested
+ var name = msg.name;
+ var myImgElement = $("#" + name);
+ myImgElement.addClass('img-disable');
+ });
socket.on('disconnect', function() {
console.log('disconnected');
@@ -134,6 +151,13 @@
function clickImg(element) {
console.log(element.id);
+
+ //-----Testing------------------
+ //var name = element.id;
+ //var myImgElement = $("#" + name);
+ //myImgElement.addClass('img-disable');
+ // -----------------------------
+
var c = new creature(element.id, socket);
c.click()
}